无限期运行PHP函数-在函数刚刚完成后直接运行函数

无限期运行PHP函数-在函数刚刚完成后直接运行函数,php,Php,我有一个PHP函数,它可以访问API并提取数据。 这大约需要6个小时。 我希望函数在刚刚完成后直接运行,而不是玩弄cron作业计时 例如 <?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

我有一个PHP函数,它可以访问API并提取数据。 这大约需要6个小时。 我希望函数在刚刚完成后直接运行,而不是玩弄cron作业计时

例如

<?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()
}

编辑:按照IMSoP所述使用上述解决方案

如果您知道后果以及为了让脚本无限期运行所需的设置,您可以再次调用相同的函数:

function run_for_six_hours() {
    // runs for six hours
    run_for_six_hours();
}

编辑:按照IMSoP所述使用上述解决方案

如果您知道后果以及为了让脚本无限期运行所需的设置,您可以再次调用相同的函数:

function run_for_six_hours() {
    // runs for six hours
    run_for_six_hours();
}

您描述的方法是无限递归-函数反复调用自身(从技术上讲,您拥有的是“相互递归”,因为您有额外的包装器
复制\u上面的\u函数
,这是不必要的)。问题是,在大多数语言(包括PHP)中,每个调用都将其状态存储在堆栈上,直到其内部的所有内容都返回,因此,您将有一个堆栈,如
运行六小时->复制上面的函数->运行六小时->复制上面的函数->运行六小时->运行六小时->复制上面的函数->复制上面的函数->越来越长。最终,PHP将达到极限(内存或最大堆栈深度)并崩溃

一种简单得多的方法是将函数放入无限循环中:

PHP将等待函数完成,一次又一次地运行它。只要实现中没有内存泄漏,它就会无限期地运行。您需要通过将其设置为
0
(永远运行)来禁用它


但是,如果脚本因任何原因崩溃,它将不会重新启动,直到您登录并再次运行它。一种更好的方法是使用一个只运行一次代码的脚本,并使用外部程序重复运行该脚本。正是为了这个目的而构建的-把它想象成类似于
cron
,但不是“在指定的时间运行”,而是说“确保它始终在运行”。

您描述的方法是无限递归-函数反复调用自身(从技术上讲,您所拥有的是“相互递归”),因为您有一个额外的包装器
复制\u上面的\u函数
,这是不必要的)。问题是,在大多数语言(包括PHP)中,每个调用都将其状态存储在堆栈上,直到其内部的所有内容都返回,因此,您将有一个堆栈,如
运行六小时->复制上面的函数->运行六小时->复制上面的函数->运行六小时->运行六小时->复制上面的函数->复制上面的函数->越来越长。最终,PHP将达到极限(内存或最大堆栈深度)并崩溃

一种简单得多的方法是将函数放入无限循环中:

PHP将等待函数完成,一次又一次地运行它。只要实现中没有内存泄漏,它就会无限期地运行。您需要通过将其设置为
0
(永远运行)来禁用它


但是,如果脚本因任何原因崩溃,它将不会重新启动,直到您登录并再次运行它。一种更好的方法是使用一个只运行一次代码的脚本,并使用外部程序重复运行该脚本。正是为了这个目的而构建的-可以把它看作是
cron
,但不是“在指定的时间运行”,而是说“确保它始终在运行”。

为什么要限制函数?“我知道独立运行PHP不是最佳实践”,这可能是最糟糕的实践。“而不是玩弄cron作业计时”这是一个解决方案。是时候指出谷歌在搜索“递归”时的幽默了:(1)一个无限期运行的php守护进程在5-10年前可能不是最佳实践,但我认为现在没有什么大的理由避免它。PHP7特别解决了许多性能问题和内存优化。@AymDev我编写了几十个长期运行的PHP进程,但问题很少。cron也不是应该持续运行的解决方案,因为它需要您重新设计锁和监控,而这些都是通过专用工具更好地解决的。为什么您要重新定义函数?“我知道独立运行PHP不是最佳实践”在这一点上可能是最糟糕的实践。“而不是玩弄cron作业计时”这是一个解决方案。是时候指出谷歌在搜索“递归”时的幽默了:(1)一个无限期运行的php守护进程在5-10年前可能不是最佳实践,但我认为现在没有什么大的理由避免它。PHP7特别解决了许多性能问题和内存优化。@AymDev我编写了几十个长期运行的PHP进程,但问题很少。cron也不是应该持续运行的解决方案,因为它需要您重新创建锁和监视,而这些都是通过专用工具更好地解决的。请记住,将
最大执行时间
更改为0实际上这里根本没有递归的理由,您最终将达到堆栈限制或内存不足。您是对的,您的解决方案在这方面要好得多。请记住将
最大执行时间更改为0这里实际上根本没有递归的理由,最终,您将达到堆栈限制或内存不足。您是对的,您的解决方案在这方面要好得多。