使用Cron一次只允许一个PHP脚本实例

时间:2010-06-20 21:23:47

标签: php cakephp cron

我似乎无法想出这个。

我有一个验证器类型的脚本,用于验证服务器上的某些文件(检查是否存在,其内容等)。我希望它只用一个实例连续运行,而不是更多。我目前的解决方案似乎没有用,我猜是因为超时(可能还有其他原因)。对于我验证的每个文件,我将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(我认为)。

关于如何做到这一点的任何其他想法?非常感谢帮助。

1 个答案:

答案 0 :(得分:3)

我建议您锁定不是文件本身,而是实际的file lock

$fp = fopen($trigger_file2, "r+");

if (!flock($fp, LOCK_EX | LOCK_NB)) {
    die("another script running");
}

LOCK_NB在Windows上不受尊重,但您似乎没有使用它。