【问题标题】:Multiple PHP scripts run at same time in Cron多个 PHP 脚本在 Cron 中同时运行
【发布时间】:2016-11-14 05:03:09
【问题描述】:

我有一个如下所示的 crontab

* 22 * * * php /var/www/domain1/cron.php
* 22 * * * php /var/www/domain2/cron.php
* 22 * * * php /var/www/domain3/cron.php
* 22 * * * php /var/www/domain4/cron.php
...

然而,上面显示的脚本似乎搞砸了,每个都运行了一百次!我不确定为什么会发生这种情况,但由于它们都设置为同时开始,我会尝试改变它。应该说,如果我手动运行每个 cron 文件,我看不到这样的行为并得到预期的行为。

我可以让 cron 一次只运行一行吗?这样当 domain1/cron.php 运行时它不会在 domain1/cron.php 完成之前运行 domain2/cron.php 吗?

我无法为他们更改时间,因为我无法确定每个人何时结束。在一个域上可能需要 3 秒,而在另一个域上可能需要 30 分钟。

【问题讨论】:

  • * 22 表示在22:0022:0122:0222:0322:59 处运行脚本。所以每个脚本会运行 60 次。
  • 原来这是我的错误。愚蠢的我。当然它应该只运行一次,这意味着它应该是0 22 * * *

标签: php cron


【解决方案1】:

如果你有root权限,可以试试这种方式。

* 22 * * * /root/sbin/allDomainsCron.sh

其中 allDomainsCron.sh 一一包含您的域 cron.php:

#!bin/bash
php /var/www/domain1/cron.php
php /var/www/domain2/cron.php
php /var/www/domain3/cron.php
php /var/www/domain4/cron.php
...

因此您可以确保一次只运行一个 cron.php。

如果您每天 22:00 运行一次脚本,则此代码将完成工作:

0 22 * * * /root/sbin/allDomainsCron.sh

【讨论】:

  • 我选择了这种方法并修复了我的错误,即我不打算在 22 到 23 之间每分钟运行一次脚本,而是只运行一次。
  • 他为什么需要root权限?脚本不一定要在/root,可以在他自己的目录下。
  • 你说得对,如果脚本在别处,他不需要root权限。当脚本在/root目录下时,使用我上面的示例时,他需要具有root权限。
【解决方案2】:

将它们全部放在一个命令行上,以便它们按顺序运行。

* 22 * * * php /var/www/domain1/cron.php; php /var/www/domain2/cron.php; php /var/www/domain3/cron.php; php /var/www/domain4/cron.php

但由于此 cron 作业在 22 小时内每分钟运行一次,因此如果花费超过一分钟,您仍然会遇到重叠。

【讨论】:

    【解决方案3】:

    不,crontab 不提供按顺序执行。以这种方式使用 cron 也是不可靠的。相反,您可能想要的是一个实际的队列或作业管理器,它可以比 crontabs 更可靠地有效控制所需作业执行的结果和流程。您可以为此签出 RabbitMQ、ZeroMQ 或 Gearman 之类的东西。或者,如果您使用 AWS,SQS 是一个好的开始。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-08
      • 2011-11-07
      • 1970-01-01
      • 2017-06-23
      • 2014-11-01
      • 2010-10-16
      • 2013-03-05
      • 2018-07-05
      相关资源
      最近更新 更多