我想要一个用作计数器的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);
答案 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库的一部分,您可能也感兴趣。