在我的 php 代码中,我想创建一个读写器代码。所以会有一个php代码枯萎读取或写入的文件。只能有 1 个写者,也可以有多个读者,但可以同时写和读。
如何在 PHP 中做到这一点?我相信你需要使用flock
代码?
在我的 php 代码中,我想创建一个读写器代码。所以会有一个php代码枯萎读取或写入的文件。只能有 1 个写者,也可以有多个读者,但可以同时写和读。
如何在 PHP 中做到这一点?我相信你需要使用flock
代码?
我同意 Danack 的评论- 的php 文档包含flock()
一个非常好的示例:
$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 上,例如 PHPflock()
使用内核函数flock()
,man 2 flock
解释它是如何工作的:
flock() 仅放置咨询锁;给定文件的适当权限,进程可以自由地忽略flock() 的使用并在文件上执行I/O。
意义flock()
只会给其他进程一个建议。如果他们不关心,无论锁(或锁的类型)如何,他们都可以读取甚至写入。然而,手册页是关于 Linux 的,其他系统可能会以不同的方式处理这个问题。(实际上并非如此)
但是,由于您是进程的编码员,因此您可以/并且应该关心flock()
每次访问文件时使用的锁。但是您不能确定另一个进程(例如文本编辑器)不会覆盖您的文件
如果你想同时阅读和写作,那么你不能。这是不安全的行为。只需使用排他锁写入,您的读者(使用共享锁)将在等待能够读取它时阻塞。这样他们就永远无法从部分完成的文件中读取,但最终总是能够读取。
哦,不要锁定文件超过你需要的时间。如果您正在进行长时间的更改(例如等待网络活动),请将其锁定、更新、解锁,等到您获得更多数据,然后锁定、更新、解锁。或者更好的是,在内部缓冲数据并一次性写入。