首页 > 解决方案 > 无限期运行 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 并不是最佳实践,但对于这种情况,我们目前没有更好的选择。

标签: 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,但不是“在指定时间运行”,而是说“确保它始终在运行”。


推荐阅读