在我的PHP代码中,我想创建一个读/写代码。因此,将会有一个PHP代码读取或写入的文件。只能有1个作者,或者可以有很多读者,但你可以同时写作和阅读。
如何在PHP中完成?我相信您需要使用flock
代码?
答案 0 :(得分:9)
我与Danack's comment合作 - flock()
的{{3}}包含一个很好的例子:
$fp = fopen("/tmp/lock.txt", "r+");
if (flock($fp, LOCK_EX)) { // exclusive lock will blocking wait until obtained
fwrite($fp, "Write something here\n");
// or ...
execute_code_that_shouldnt_run_twice_at_the_same_time();
flock($fp, LOCK_UN); // unlock
} else {
echo "failed to obtain lock";
}
fclose($fp);
请注意,默认模式下的flock()
会阻塞等待直到获得锁定。如果其他进程当前获得锁定,则这是常规的。
但是不要期望flock()
函数过多。它使用所谓的顾问锁,其他进程可以忽略它。在Linux上,例如PHP的flock()
使用内核函数flock()
,man 2 flock
解释了它的工作原理:
flock()仅提供咨询锁;给予适当的权限 文件,进程可以自由地忽略flock()的使用并执行I / O. 文件。
含义flock()
只会给其他进程提供建议。如果他们不关心他们可以阅读甚至写,无论锁(或锁的类型)。然而,手册页是关于Linux的其他系统可能会以不同的方式处理它。 (事实并非如此)
但是,无论您是进程的编码员,每次访问文件时都可以/并且应该关注使用flock()
的锁定。但是你不能确定另一个进程 - 比如文本编辑器 - 不会覆盖你的文件
答案 1 :(得分:0)
如果你想同时读写,那么你不能。这是不安全的行为。只需使用独占锁写入,您的读者(使用共享锁)将在等待能够读取时阻止。这样他们就永远无法从部分完成的文件中读取,但最终总能读取。
哦,不要将文件锁定的时间超过你需要的时间。如果您进行了长时间的更改(例如等待网络活动),请将其锁定,更新,解锁,等待您获得更多数据,锁定,更新,解锁。或者更好的是,在内部缓冲数据并一次性写入。