网页的单个实例

时间:2010-08-02 12:42:03

标签: php mysql cron

我有几个由cron调用的php脚本。 cron工作每20分钟运行一次。有时脚本会在几分钟内完成工作,有时需要超过20分钟。

我想在这里阻止比赛。我想到的一种方法是在页面运行时使用数据库设置标志,并在作业完成时删除标志。但我真的不想使用数据库。

还有其他解决方案吗?

5 个答案:

答案 0 :(得分:2)

您可以使用标记文件,共享内存区域或任何其他正常形式的进程间通信。金板解决方案是实施一个小批量队列流程。

答案 1 :(得分:2)

最好的方法(我使用过)涉及将进程ID保存在“锁定文件”中。

function getLock() {
    //First, check to see if the script is already running
    $data = @file_get_contents('path/to/process.pid');
    if ($data && posix_kill($data, 0)) {
        throw new RuntimeException(
            'Unable To Attain Lock, Another Process Is Still Running'
        );
    }
    file_put_contents('path/to/process.pid', posix_getpid());
}

基本上,它读取文件,然后尝试posix_kill里面包含的pid。请注意,当您使用0posix_kill的信号时,它只会告诉您调用是否成功(意味着进程正在运行)。

这样做的好处是,如果进程在没有清理锁定文件的情况下死亡,它将被检测到并将再次运行。

答案 2 :(得分:1)

您可以使用flock()锁定预定义的“flag”文件,并在启动脚本之前检查该文件是否仍然处于锁定状态。

答案 3 :(得分:1)

如果您创建一个pid文件以指示进程正在运行,请确保检查文件何时创建并且具有适当的阈值,以确定多长时间。这样,如果你的工作在有机会删除它的pid文件之前就已经死了,你的工作就不会停止。

答案 4 :(得分:0)

当然,临时文件=]

或分叉过程。请点击此处查看更多信息:http://php.net/manual/en/function.pcntl-fork.php

建议:http://www.saynotoflash.com/archives/multi-process-php-execution/