Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 防止重复cron作业同时运行_Php_Cron - Fatal编程技术网

Php 防止重复cron作业同时运行

Php 防止重复cron作业同时运行,php,cron,Php,Cron,我有一个通过CRON作业运行的PHP程序。CRON作业需要每15分钟启动一次。但是,如果以前运行的CRON作业仍在运行,则不需要启动新的CRON作业 这里的其他答案(有些相当古老,可以追溯到2010年)说,在CRON作业运行行中使用FLOCK。因此,我使用了与此类似的CRON作业(命令行已断开以便于阅读): 根据我在这里从其他答案中读到的内容,这个命令行应该创建锁文件(lockit.lockfile),然后运行cronjob.php程序。如果锁文件已被锁定,则crontjob.php文件将不会运

我有一个通过CRON作业运行的PHP程序。CRON作业需要每15分钟启动一次。但是,如果以前运行的CRON作业仍在运行,则不需要启动新的CRON作业

这里的其他答案(有些相当古老,可以追溯到2010年)说,在CRON作业运行行中使用FLOCK。因此,我使用了与此类似的CRON作业(命令行已断开以便于阅读):

根据我在这里从其他答案中读到的内容,这个命令行应该创建锁文件(lockit.lockfile),然后运行cronjob.php程序。如果锁文件已被锁定,则crontjob.php文件将不会运行

当前运行的cronjob.php完成后,应该会释放lockit.logfile文件上的锁。然后,cronjob.php的下一次计划运行应该正常运行

这在我的系统(共享主机、PHP7.3、Apache2.4.48)上似乎不起作用。cronjob.php文件的第二个实例运行,即使第一个实例没有完成

有没有更好的办法?我还需要确保,如果第一个cronjob.php由于任何原因在完成之前死亡,那么下一个cronjob.php将运行

(请注意,我已经查看了以前的答案,但这些答案都很旧(2015年及更早),因此我希望确保我使用的是当前的最佳实践。我也无法访问共享主机上的服务器命令行。)

已添加

在上面的命令中使用flock是基于这个答案的,它表明flock命令将在程序完成时解锁锁文件

所以cronjob.PHP的PHP代码并不重要,至少根据这个答案是这样的。但是,如果cronjob.php的第一个实例仍在运行,那么上面的CRON命令行(使用该flock命令)似乎不会阻止第二个实例启动


这就是我问这个问题的原因-如果第一个实例尚未完成,是否有更好的(更近期的)方法来阻止CRON作业的第二个实例运行。

您如何检查锁文件的存在?请显示您的代码。@kmoser这就是
flock
实用程序的用途。您需要检查是否创建了锁文件。在测试时,您不应该盲目地删除所有输出。出于测试目的,可以使用一些简单的
sleep
命令来尝试flock策略。当然,您也可以在不使用
flock
实用程序的情况下实现同样的功能,并通过php维护锁文件。但是如果不先解决这个问题,您可能会遇到同样的问题……您可以尝试将命令放在shell脚本中运行(
/usr/local/bin/php/home1/path/to/php/file/cronjob.php>/dev/null 2>&1
),然后放入
[“${FLOCKER}”!=“$0”]&&exec env FLOCKER=“$0”flock-en“$0”“$0”“$@”||:
位于脚本顶部,如中倒数第二个示例所示。@kmoser-请参阅问题的新增信息。在原始问题的CRON作业中指定的flock的使用似乎不会阻止第二个实例在第一个实例未完成时启动。
    /usr/bin/flock -xn /home1/path/to/lock/file/lockit.lockfile
 /usr/local/bin/php /home1/path/to/php/file/cronjob.php >/dev/null 2>&1