【问题标题】:How can I lock a file to protect against multiple ajax requests reading/writing the same file?如何锁定文件以防止读取/写入同一文件的多个 ajax 请求?
【发布时间】:2019-10-01 15:53:32
【问题描述】:

我目前正在尝试阻止读取已存在且包含内容的文件。我正在使用flock 方法来尝试阻止正在运行的脚本的其他实例访问它,但它不起作用。这只是多核服务器的问题。

while ($aEvent = current($aEvents)){
    $sLockFile = '/var/tmp/'.md5($aEvent['id']).'.LCK';
    $oFile = fopen($sLockFile, 'c+');
    if (flock($oFile, LOCK_EX) && fgets($oFile) == '') {
        fwrite($oFile, 'locked');
        fclose($oFile);
    } else {
        fclose($oFile);
        next($aEvents);
        continue;
    }
    /*
     * Do stuff here.
     */
    next($aEvents);
}

因此,从这段代码中,我希望创建、锁定和写入文件,并且任何尝试随后读取/写入文件的请求要么在 flock 调用或空检查时停止。实际上,如果代码同时受到足够多的 ajax 请求,则同一文件被创建/覆盖多次。有什么方法可以保证 PHP 线程的安全吗?

【问题讨论】:

    标签: php ajax file asynchronous file-locking


    【解决方案1】:

    听起来您想将LOCK_NB 位添加到您的flock 调用中。来自the flock docs

    默认情况下,该函数会一直阻塞,直到获得请求的锁;这可以通过 LOCK_NB 选项来控制

    您的代码将在每次调用flock 时阻塞,直到可以获取锁为止。如果存在锁,听起来您想跳到else 块。如果是这样,你想在你的代码中这样做:

    <?php
    if (flock($oFile, LOCK_EX | LOCK_NB) && fgets($oFile) == '')
    ...
    

    【讨论】:

    • 将尝试并报告结果。但是根据我对那个 doc 块的理解,默认情况下它会阻塞直到它锁定。 LOCK_NB 选项会禁用它,不是吗?
    • 是的,正如我所料,这似乎没有什么不同。
    • 是的,你是想阻塞直到获得锁,还是快速失败进入 else 块?我不确定我是否理解您要执行的操作。
    • 只要文件只被访问一次,我可以接受任何一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    相关资源
    最近更新 更多