我正在使用 cronjob 运行 php 脚本,该脚本每 1 分钟执行一次
我还需要确保仅运行副本,因此如果此 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 看到了“互斥类”但不确定它是否稳定以及有人尝试过。
最佳答案
您可能想使用我的库 ninja-mutex它提供了处理互斥体的简单接口(interface)。目前可以使用flock、memcache、redis或mysql来处理锁。
下面是一个使用 memcache 的示例:
<?php
require 'vendor/autoload.php';
use NinjaMutex\Lock\MemcacheLock;
use NinjaMutex\Mutex;
$memcache = new Memcache();
$memcache->connect('127.0.0.1', 11211);
$lock = new MemcacheLock($memcache);
$mutex = new Mutex('very-critical-stuff', $lock);
if ($mutex->acquireLock(1000)) {
// Do some very critical stuff
// and release lock after you finish
$mutex->releaseLock();
} else {
throw new Exception('Unable to gain lock!');
}
关于php - 确保 php 脚本的一份副本在后台运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16389228/