php - 无限期运行 PHP 函数 - 函数刚完成后直接运行
问题描述
我有一个 PHP 函数,它可以访问 API 并提取数据。这需要大约 6 个小时。我想要的不是玩 cron-job 计时,而是让函数在它刚刚完成后直接运行。
例如...
<?php
function run_for_six_hours() {
// runs for six hours
copy_of_the_above_function();
}
function copy_of_the_above_function() {
// do the same thing again
run_for_six_hours()
}
上面的这个方法行得通,还是有更好的方法?
我已经做了一些研究,我知道无限期地运行 PHP 并不是最佳实践,但对于这种情况,我们目前没有更好的选择。
解决方案
您描述的方法是无限递归- 函数反复调用自身(从技术上讲,您拥有的是“相互递归”,因为您有额外的 wrapper copy_of_the_above_function
,这不是必需的)。问题在于,在大多数语言(包括 PHP)中,每个调用都将其状态存储在堆栈中,直到其中的所有内容都返回,因此您将拥有一个run_for_six_hours -> copy_of_the_above_function -> run_for_six_hours -> copy_of_the_above_function -> run_for_six_hours -> copy_of_the_above_function -> ...
越来越长的堆栈。最终,PHP 将达到限制(内存或最大堆栈深度)并崩溃。
一个更简单的方法是将函数置于无限循环中:
while ( true ) {
run_for_six_hours();
}
PHP 将等待函数完成,一次又一次地运行它。只要实现中没有内存泄漏,它将无限期地运行。您需要通过将其设置为(永远运行)来禁用PHP 的max_execution_time
设置。0
但是,如果脚本由于任何原因崩溃,它不会重新启动,直到您登录并再次运行它。更好的方法是让脚本运行一次代码,然后使用外部程序重复运行脚本。Supervisor正是为此目的而构建的 - 将其视为类似cron
,但不是“在指定时间运行”,而是说“确保它始终在运行”。
推荐阅读
- matlab - 如何在 Matlab 中打印出哈希表?
- javascript - 如何在典型的编程语言中使用逗号符号表示这个向量代数以进行 2d 点计算?
- amazon-web-services - 异步调用 lambda 函数
- reactjs - 尝试导入错误:未从“react-spring”导出“动画”
- apache-dolphinscheduler - 停止和暂停有什么区别?
- javascript - 如何估计 68 个面部标志的间距?
- html - 在 Django 中的所有页面上处理 LoginView 登录的最佳方法
- html - 抓取网站特定部分的问题
- python - 为什么在成员变量上使用海象运算符会引发 SyntaxError?
- amazon-web-services - 从 AWS API Gateway 请求访问浏览器 UBID