好的,我知道这个网站上有关于这个问题的类似问题,但是这些问题和提供的答案都不是我所需要的。
我正在构建基于平面文件的 CMS。
例如,如果:
2、3、10.....追加模式下的fwrite请求同时到达同一个php文件“contact_form_messages_container.php”?
2、3、10.....“w”模式下的 fwrite 请求再次同时到达同一 php 文件,该文件保存最简单的特定页面访问次数?
我知道flock()函数,但可能会发生两个或多个flock()请求同时出现......有谁知道这个问题的解决方案吗?我唯一想到的是 usleep() - 使用 while 循环执行脚本一段时间,直到目标文件变得可用,但我不知道它是否有效,在哪里以及如何执行此操作?
有人对这个问题有实际经验吗?
提前致谢!
The flock()
函数旨在处理多个并发读取器和写入器的文件操作;默认情况下flock()
可以挂起进程,直到获得兼容的锁(即共享锁或独占锁)。一旦获得,稍后可以释放锁以允许其他进程对该文件进行操作;当文件关闭或进程结束时,锁会隐式释放。
除非您的文件位于 NFS 上,否则我非常怀疑您是否会遇到同时给出两个冲突锁的情况。
下面说明了使用的基本示例flock()
:
// open the file (take care to not use "w" mode)
$f = fopen('file.txt', 'r+');
// obtain an exlusive lock (may suspend the process)
if (flock($f, LOCK_EX)) {
// this process now holds the only exclusive lock
// make changes to the file
// release the lock
flock($f, LOCK_UN);
}
// don't perform any write operation on $f here
fclose($f);
使用LOCK_NB
旗帜与LOCK_EX
or LOCK_SH
将防止进程被暂停;如果呼叫返回false
可以传递第三个参数来确定进程是否会被挂起(Windows 上不支持)。
if (false === flock($f, LOCK_EX | LOCK_NB, $wouldblock)) {
if ($wouldblock) {
// the lock could not be obtained without suspending the process
} else {
// the lock could not be obtained due to an error
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)