我似乎无法想出这个。
我有一个验证器类型的脚本,用于验证服务器上的某些文件(检查是否存在,其内容等)。我希望它只用一个实例连续运行,而不是更多。我目前的解决方案似乎没有用,我猜是因为超时(可能还有其他原因)。对于我验证的每个文件,我将php超时设置为60秒。我在脚本的顶部有这个:
$trigger_file2 = 'path/to/a/randomfile';
if (file_exists($trigger_file2)){
//another script is working, exit
exit;
}
// create file inside app
$handle = fopen($trigger_file2, 'w');
fwrite($handle, '0');
fclose($handle);
在脚本结束时,我只在触发器文件上使用unlink()。由于可能的超时以及可能的其他原因,触发器文件并不总是被删除并导致问题。我还尝试添加代码来检查修改触发器文件的时间,如果超过10分钟,则会删除,但这实际上是低效的,因为问题经常发生。
有关如何解决此问题的任何想法?我想过用PID运行脚本做一些事情,但我正在使用CakePHP作为脚本,因此每个进程看起来都像是使用了index.php(我认为)。
关于如何做到这一点的任何其他想法?非常感谢帮助。
答案 0 :(得分:3)
我建议您锁定不是文件本身,而是实际的file lock。
$fp = fopen($trigger_file2, "r+");
if (!flock($fp, LOCK_EX | LOCK_NB)) {
die("another script running");
}
LOCK_NB
在Windows上不受尊重,但您似乎没有使用它。