停止PHP脚本的并行执行

时间:2010-06-26 07:38:03

标签: php

我试图阻止我的cron脚本允许它并行运行。我需要它,以便在没有当前执行时,脚本将被允许运行直到它完成,脚本超时或发生异常。

我一直在尝试使用PHP flock函数来启用文件锁,运行脚本然后释放锁。但是,它仍然看起来我可以并行多次运行脚本。我错过了什么吗?

顺便说一下,我正在使用Mac文件系统在Mac OS X上开发,也许这就是文件锁被忽略的原因?虽然PHP文档只关于NTFS文件系统?

        // Construct cron lock file path
    $cronLockFilePath = realpath(APPLICATION_PATH . '/locks/cron');

    // Get cron lock file
    $cronLockFile = fopen($cronLockFilePath, 'r');

    // Lock cron lock file
    if (flock($cronLockFile, LOCK_EX)) {

echo 'lock';
sleep(10);

    } else {

echo 'no lock';
    }

3 个答案:

答案 0 :(得分:3)

你的想法基本上是正确的,但修补文件锁通常会导致奇怪的行为。

只需在脚本启动时创建一个文件并在最后删除它。该文件的存在将指示cron是否已在运行。绝对确定,即使cron在中途遇到错误,文件也会被删除。

答案 1 :(得分:1)

来自文档:

  

警告

     

在某些操作系统上,flock()是   在流程层面实施。什么时候   使用像多线程的服务器API   您可能无法依赖的ISAPI   flock()保护文件免受其他攻击   PHP脚本并行运行   同一服务器实例的线程!

您可以尝试创建和删除文件,或者在其中写入内容。

答案 2 :(得分:0)

我认为你可以做的是在脚本开始执行时在某处编写一个常规文件(lock.txt或其他东西),没有任何flocks,并在脚本停止运行时将其删除。然后始终检查初始化该文件是否已存在 - 另一个实例正在运行。