无限期运行PHP函数-在函数刚刚完成后直接运行函数
我有一个PHP函数,它可以访问API并提取数据。 这大约需要6个小时。 我希望函数在刚刚完成后直接运行,而不是玩弄cron作业计时 例如无限期运行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
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这里实际上根本没有递归的理由,最终,您将达到堆栈限制或内存不足。您是对的,您的解决方案在这方面要好得多。