我正在为我的php应用程序开发cron作业,并计划通过wget / curl使用cron。 我的一些php cron工作可能需要2-3个小时。如何让php从cron tab工作2-3个小时?通过cron wget / curl运行如此长时间的工作是一种好习惯吗?有人有这方面的经验吗?我也有电子邮件队列,我需要每10秒运行一次,但是cron选项卡是分钟级别的。对此案有何建议?
感谢阅读。
答案 0 :(得分:4)
当您使用wget / curl时,您正在从网络服务器请求页面。每个网络服务器都有一个超时期限,因此可能会超时。
此外,一些托管服务提供商可能会停止运行超过某些时间的流程(基本上是为了控制流氓线程)。
因此,如果工作时间超过几分钟,建议使用wget / curl进行安排。
尝试使用实际调度程序安排它。您可以从命令行运行php
php [options] [-f] [ - ] [参数...]
php命令应该在路径上。
答案 1 :(得分:2)
您可以在脚本开头使用以下命令告诉PHP实际上永远不会超时:
set_time_limit(0);
更明智的是,如果crontab要每24小时运行一次脚本,请将超时设置为24小时,这样就不会同时运行两个副本。
set_time_limit(24*60*60);
Crontab只允许分钟级执行,因为这是您应该真正启动脚本的最常见的 - 启动/关闭成本使得更快速的调度效率低下。
如果您的应用程序需要每10秒检查一次队列,那么更好的策略可能是让一个长时间运行的脚本执行该检查并偶尔使用sleep()来阻止自己占用系统资源。
在UNIX系统上,这样的脚本应该作为守护进程运行 - 看看PEAR System_Daemon包,看看如何简单地完成它。
答案 2 :(得分:2)
我刚刚通过cron和wget执行了长时间运行的PHP脚本。由于wget中的默认超时,脚本在15分钟后终止。
但是我相信如果你设置了正确的超时,这种方法确实有效。您运行的PHP脚本需要设置为具有无限的运行时间。最好在长时间运行的脚本开始时设置它。
set_time_limit(0);
使用wget时,还需要通过传递-T0来删除其超时。 e.g。
wget -q0 -T0 http://yourhost/job.php
请注意不要使用长时间运行的脚本使服务器过载。
答案 3 :(得分:0)
如果使用wget
来调用长时间运行的cron作业,请考虑这种情况下不希望使用的某些默认值。默认情况下,如果在900秒的--tries
内未读取任何数据,它将进行20次--read-timeout
。因此,为了使cron作业仅被调用一次,最大尝试将其设置为1,因为您当然不希望长时间运行的脚本在运行时被多次调用。
wget -t 1 https://url/
如果在cPanel上运行每个cron作业后您都不关心任何输出电子邮件,还可以使用以下标志-O和-q隐藏输出,并使用2>&1重定向错误。
wget -O /dev/null -q -t 1 https://url/ 2>&1