【问题标题】:Having Trouble Allowing Only One Instance of a PHP Script at a Time, Using Cron使用 Cron 一次只允许一个 PHP 脚本的实例时遇到问题
【发布时间】:2010-06-21 05:27:11
【问题描述】:

我似乎无法弄清楚这一点。

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

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

【问题讨论】:

    标签: php cakephp cron


    【解决方案1】:

    我建议你不要锁定文件本身,而是一个实际的file lock

    $fp = fopen($trigger_file2, "r+");
    
    if (!flock($fp, LOCK_EX | LOCK_NB)) {
        die("another script running");
    }
    

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

    【讨论】:

    • 感谢您的帮助!只是为了确保您在上面发布的代码是否足以用于整个脚本?可以在一个甚至不存在的文件上创建一个锁吗?我只是不是 100% 知道如何使用它。我阅读了有关羊群的手册,但简单的解释会很棒!非常感谢。
    • @user371699 只需在你的脚本前面加上它。正如我所说,如果文件不存在,fopen 将失败,您都可以在写入模式下打开它以强制创建它。
    • 为什么不锁定文件本身?
    猜你喜欢
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多