3

我正在为我的 php 应用程序处理 cron 作业,并计划通过 wget/curl 使用 cron。我的一些 php cron 作业可能需要 2-3 个小时。如何让 php 从 cron 选项卡工作 2-3 小时?通过 cron wget/curl 运行这么长时间的作业是一种好习惯吗?有人有这方面的经验吗?我也有电子邮件队列,我需要每 10 秒运行一次,但 cron 选项卡是分钟级别的。对这个案子有什么建议吗?

谢谢阅读。

4

4 回答 4

4

当您使用 wget/curl 时,您正在从网络服务器请求页面。每个网络服务器都会有一个超时时间,所以这可能会超时。

此外,一些托管服务提供商可能会停止运行超过特定分钟的进程(基本上是为了控制流氓线程)。

因此,如果作业花费的时间超过几分钟,则不建议使用 wget/curl 进行安排。

尝试使用实际的调度程序对其进行调度。您可以从命令行运行 php

php [选项] [-f] [--] [参数...]

php 命令应该在路径上。

于 2009-05-10T06:44:55.373 回答
2

您可以在脚本的开头使用以下内容来告诉 PHP 有效地永不超时:

set_time_limit(0);

更明智的做法是,如果 crontab 打算每 24 小时运行一次脚本,请将超时设置为 24 小时,这样您就不会同时运行两个副本。

set_time_limit(24*60*60);

Crontab 只允许分钟级执行,因为这是您真正应该启动脚本的最常见的情况 - 启动/关闭成本会导致更快速的调度效率低下。

如果您的应用程序需要每 10 秒检查一次队列,则更好的策略可能是使用一个长时间运行的脚本来执行该检查并偶尔使用 sleep() 来阻止自己占用系统资源。

在 UNIX 系统上,这样的脚本应该真正作为守护进程运行 - 查看 PEAR System_Daemon包以了解如何简单地完成此操作。

于 2009-05-10T09:35:56.817 回答
2

我刚刚遇到了通过 cron 和 wget 执行的长时间运行的 PHP 脚本的问题。由于 wget 中的默认超时,该脚本在 15 分钟后终止。

但是,如果您设置了正确的超时,我相信这种方法实际上确实有效。您运行的 PHP 脚本需要设置为无限运行时间。最好在长时间运行的脚本开始时设置它。

set_time_limit(0);

使用 wget 时,您还需要通过传递 -T0 来消除其超时。例如

wget -q0 -T0 http://yourhost/job.php

小心不要让长时间运行的脚本使服务器过载。

于 2011-09-30T20:37:11.750 回答
0

如果wget用于调用长时间运行的 cron 作业,请考虑在这种情况下不希望使用的一些默认值。默认情况下,如果在900 秒--tries内没有读取任何数据,则会读取 20 次。--read-timeout因此,最大尝试设置为 1 以确保仅调用一次 cron 作业,因为您当然不希望长时间运行的脚本在其仍在运行时被多次调用。

wget -t 1 https://url/

如果在 cPanel 上并且您不关心每个 cron 作业运行后的任何输出电子邮件,还可以使用以下标志 -O 和 -q 隐藏输出,并使用 2>&1 重定向错误。

wget -O /dev/null -q -t 1 https://url/ 2>&1
于 2019-12-10T21:16:29.897 回答