多个PHP脚本在Cron中同时运行

时间:2016-07-12 05:27:49

标签: php cron

我有一个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
...

然而,上面显示的潦草似乎陷入困境并且每次都运行了100次!我不确定为什么会发生这种情况,但由于它们都会在同一时间启动,我会尝试改变它。应该说,如果我手动运行每个cron文件,我看不到这样的行为并获得预期的行为。

我能以某种方式让cron一次只运行一行吗?那么当domain1 / cron.php运行时,它会在domain1 / cron.php完成之前运行domain2 / cron.php吗?

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

3 个答案:

答案 0 :(得分: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小时内每分钟运行一次,如果它们花费超过一分钟,你仍然会重叠。

答案 1 :(得分:2)

如果您拥有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

答案 2 :(得分:0)

不,crontab不为您提供按顺序执行。以这种方式使用cron也是不可靠的。您可能想要的是一个实际的队列或作业管理器,它可以比crontabs更可靠地有效地控制所需作业执行的结果和流程。你可以检查一下像RabbitMQ,ZeroMQ或Gearman这样的东西。或者,如果您正在使用AWS,SQS是一个良好的开端。