如何在PHP中使用flock?

时间:2013-03-08 23:49:07

标签: php

在我的PHP代码中,我想创建一个读/写代码。因此,将会有一个PHP代码读取或写入的文件。只能有1个作者,或者可以有很多读者,但你可以同时写作和阅读。

如何在PHP中完成?我相信您需要使用flock代码?

2 个答案:

答案 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)

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

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