使用wget/curl进行的长时间cron作业?

3
我正在为我的PHP应用程序开发cron jobs,并计划使用wget/curl来执行cron。我的一些PHP cron jobs可能需要2-3个小时的时间。如何让PHP在cron tab中工作2-3个小时?是否通过cron wget/curl运行这样长时间的jobs是一个好的实践方式?有人有这方面的经验吗?我还有一个邮件队列,需要每10秒运行一次,但cron tab只能以分钟为单位。对于这种情况,有什么建议吗?
感谢您的阅读。
4个回答

4
当你使用wget/curl时,你正在请求一个网页从一个Web服务器。每个Web服务器都会有一个超时时间,所以这可能会超时。
而且一些托管提供商可能会停止运行超过某些分钟的进程(基本上是为了控制恶意线程)。
因此,如果任务需要超过几分钟,则不建议使用wget/curl进行调度。
尝试使用实际的调度程序进行调度。您可以从命令行运行php

php [options] [-f] [--] [args...]

php命令应该在路径上。

如果我从命令行使用 PHP 脚本,执行时间很长是否可以?我的一些任务确实需要很长时间。谢谢回复。 - taras
我有一个 PHP 脚本运行了 14 天,只因为存在内存泄漏而崩溃。请记住,为了使其正常工作,您需要使用 PHP 的 CLI 版本。 - St. John Johnson
我的一些工作确实需要很长时间,如果您的托管提供商允许的话,那就没问题。 - Thejesh GN
这正是命令行界面的用处 - 通过 web 服务器调用 PHP 是疯狂的。 - David Snabel-Caunt

2
我刚刚遇到了一个问题,我通过cron和wget执行了一个长时间运行的PHP脚本。由于wget的默认超时时间,脚本在15分钟后终止。
但是,我相信如果设置正确的超时时间,这种方法确实可以奏效。您运行的PHP脚本需要设置为无限运行时间。最好在长时间运行的脚本开始时设置这个选项。
set_time_limit(0);

当使用 wget 时,您还需要通过传递 -T0 来删除其超时时间。例如:
wget -q0 -T0 http://yourhost/job.php

非常注意不要让长时间运行的脚本过载您的服务器。

2
您可以在脚本开头使用以下代码,告诉PHP永远不要超时:
set_time_limit(0);

“更明智的做法可能是,如果 crontab 每 24 小时运行一次脚本,那么将超时设置为 24 小时,这样您就不会同时运行两个副本。”
set_time_limit(24*60*60);

Crontab只允许每分钟执行一次,因为这是你应该启动脚本的最频繁的时间——启动/关闭成本使更快的调度效率低下。
如果你的应用程序需要每10秒检查一次队列,一个更好的策略可能是有一个单一的长时间运行的脚本来进行检查,并偶尔使用sleep()来防止它占用系统资源。
在UNIX系统上,这样的脚本应该作为守护进程运行——请查看PEAR System_Daemon包,了解如何简单实现。

0
如果使用wget调用长时间运行的cron作业,请考虑一些在这种情况下不理想的默认设置。默认情况下,如果在900秒的--read-timeout内未读取到数据,则会尝试--tries 20次。因此,将最大尝试次数设置为1,以确保仅调用cron作业一次,因为您当然不希望在脚本仍在运行时多次调用长时间运行的脚本。
wget -t 1 https://url/

如果您正在使用cPanel,并且不希望在每次cron作业运行后收到任何输出电子邮件,则可以使用以下标志-O和-q来隐藏输出,并使用2>&1重定向错误。

wget -O /dev/null -q -t 1 https://url/ 2>&1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接