【发布时间】:2013-05-05 21:17:00
【问题描述】:
我正在使用 cronjob 来运行每 1 分钟执行一次的 php 脚本
我还需要确保只有副本正在运行,因此如果此 php 脚本在 2 分钟后仍在运行,则 cronjob 不应运行另一个版本。
目前我有 2 个选项,我想看看您的反馈,如果您还有其他选项
选项 1:在 php 脚本启动时创建一个 tmp 文件,并在 php 脚本完成时将其删除(并检查文件是否存在)---> 这个选项对我来说的问题是,如果我的 php 脚本崩溃不管什么原因,它都不会再次运行(tmp文件不会被删除)
选项 2:运行如下所示的 bash 脚本来控制 php 脚本的执行 ---> 很好,但正在寻找可以在 php 中完成的事情
#!/bin/bash
function rerun {
BASEDIR=$(dirname $0)
echo $BASEDIR/$1
if ps -ef | grep -v grep | grep $1; then
echo "Running"
exit 0
else
echo "NOT running";
/usr/local/bin/php $BASEDIR/$1 &
exit $?
fi
}
rerun myphpscript.php
PS:我刚刚在http://www.php.net/manual/en/class.mutex.php 看到了“Mutex class”,但不确定它是否稳定并且有人尝试过。
【问题讨论】:
-
您可以在 php 中执行大部分 bash 脚本,方法是进入 shell 运行 1 个命令来检查进程是否正在运行
-
是的,我可以这样做,但它再次只是 php 中的 shell :)
-
PHP 在不进入 shell 的情况下对操作系统的访问受到限制。许多其他应用程序使用锁/进程 ID 文件来管理自己
-
Calling cron twice or triple sometimes 的可能重复项。可以以多种方式实现用于控制(或避免)并行执行的排他锁。一个常见的解决方案是简单地在 PHP 中创建一个空文件,检查它是否已经存在,并在脚本完成后将其删除。
标签: php background cron mutex