7

在我的 php 代码中,我想创建一个读写器代码。所以会有一个php代码枯萎读取或写入的文件。只能有 1 个写者,也可以有多个读者,但可以同时写和读。

如何在 PHP 中做到这一点?我相信你需要使用flock代码?

4

2 回答 2

12

同意 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()每次访问文件时使用的锁。但是您不能确定另一个进程(例如文本编辑器)不会覆盖您的文件

于 2013-03-08T23:54:35.453 回答
1

如果你想同时阅读和写作,那么你不能。这是不安全的行为。只需使用排他锁写入,您的读者(使用共享锁)将在等待能够读取它时阻塞。这样他们就永远无法从部分完成的文件中读取,但最终总是能够读取。

哦,不要锁定文件超过你需要的时间。如果您正在进行长时间的更改(例如等待网络活动),请将其锁定、更新、解锁,等到您获得更多数据,然后锁定、更新、解锁。或者更好的是,在内部缓冲数据并一次性写入。

于 2013-03-08T23:57:02.197 回答