获取文件的独占读/写锁以进行原子更新

时间:2013-12-29 19:52:43

标签: php locking

我想要一个用作计数器的PHP文件。它将a)回显txt文件的当前值,并且b)使用独占锁增加该文件,以便在使用时没有其他脚本可以读取或写入它。

用户A将写入并递增此号码,而用户B请求读取该文件。是否有可能用户A可以锁定此文件,因此在用户A的写入完成之前,没有人可以读取或写入该文件?

我过去曾使用flock,但我不确定如何让文件等到可用,而不是在它已被锁定时退出

我的目标是:

LOCK counter.txt; write to counter.txt;

同时

Read counter.txt; realize it's locked so wait until that lock is finished.

//

$fp = fopen("counter.txt", 'w+');
if(flock($fp, LOCK_EX)) {
    fwrite($fp, $counter + 1);
    flock($fp, LOCK_UN);
} else {
    // try again??
}

fclose($fp);

1 个答案:

答案 0 :(得分:4)

来自文档:By default, this function will block until the requested lock is acquired

因此,只需在您的阅读器(LOCK_SH)和编写器(LOCK_EX)中使用flock,它就可以工作了。 但是我强烈反对使用阻塞flock而不会超时,因为这意味着如果出现问题,那么你的程序将永远挂起。为了避免这种情况,请使用这样的非阻塞请求(再次,它在doc中):

/* Activate the LOCK_NB option on an LOCK_EX operation */
if(!flock($fp, LOCK_EX | LOCK_NB)) {
    echo 'Unable to obtain lock';
}

并将其包裹在for循环中,在n次尝试失败(或总等待时间)后休眠和休息。

编辑:您还可以查找一些使用示例here。这个类是ninja-mutex库的一部分,您可能也感兴趣。