如何锁定文件以防止多个ajax请求读取/写入同一文件?

时间:2019-05-14 15:03:53

标签: php ajax file asynchronous file-locking

我目前正在尝试阻止读取文件(如果该文件已经存在并且包含内容)。我正在使用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线程安全?

1 个答案:

答案 0 :(得分:0)

听起来您想将LOCK_NB位添加到flock呼叫中。来自the flock docs

  

默认情况下,此功能将阻塞,直到获得请求的锁为止;这可以通过LOCK_NB选项进行控制

您的代码将在每次调用flock时被阻止,直到获得锁为止。听起来好像您想跳到else块(如果存在锁)。如果是这样,您想在代码中执行此操作:

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