gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:36:07 28 4
gpt4 key购买 nike

我想要一个用作计数器的 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);

最佳答案

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

因此,只需在您的读取器 (LOCK_SH) 和写入器 (LOCK_EX) 中使用 flock,它就会起作用。但是,我强烈反对在没有超时的情况下使用阻塞 flock,因为这意味着如果出现问题,那么您的程序将永远挂起。为避免这种情况,请像这样使用非阻塞请求(同样,它在文档中):

/* 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 的一部分您可能也感兴趣的图书馆。

关于php - 获取文件的独占读/写锁以进行原子更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20829422/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com