什么时候flock()真的需要?

时间:2014-06-15 16:40:14

标签: php locking

我认为只要有可能对文件进行并发读取和/或更新,就应该使用文件锁定机制。

但是,我看到例如Monolog处理程序StreamHandler没有flock()文件,多个并发写入怎么办?
https://github.com/Seldaek/monolog/blob/master/src/Monolog/Handler/StreamHandler.php

另一个例子是Laravel的文件系统类:
https://github.com/laravel/framework/blob/master/src/Illuminate/Filesystem/Filesystem.php

1 个答案:

答案 0 :(得分:2)

你的问题有点模糊,但我仍然试着回答。

1)没有作家,多位读者

这种情况不需要任何锁定,因为没有数据被更改。

2)一位作家,多位读者(无,一位或多位)

没有磁盘错误,该文件不会在磁盘上损坏。但它可能会为读者腐败。一个简单的例子:你写了字符串test failed not。读者可能会阅读test failed,因为它在编写not之前读取了文件。如果这是一个问题,您需要锁定。

3)多个作者,多个读者(无,一个或多个)

此处,该文件甚至可能在磁盘上损坏。想象一下两个作家:第一个尝试写test failed not。第二次尝试写同样的东西。由于上下文切换,您最终可能会使用test failedtest failed not not。所以你需要锁定。

现在有些细节:

通常,文件系统以块的形式写入。块可能是4k大小。所以低于这个尺寸的任何东西都是原子地写的这再次意味着,那些只是以不到4k的块数记录数据的人,从来没有遇到过这个问题而且似乎并不关心。

所以基本上,你甚至不想锁定。你只想要原子写作。由于文件系统(内核)不保证这些,您必须自己实现它们。所以你需要锁定。 flock()只是创建和管理锁的一种可能性。