我认为只要有可能对文件进行并发读取和/或更新,就应该使用文件锁定机制。
但是,我看到例如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
答案 0 :(得分:2)
你的问题有点模糊,但我仍然试着回答。
1)没有作家,多位读者
这种情况不需要任何锁定,因为没有数据被更改。
2)一位作家,多位读者(无,一位或多位)
没有磁盘错误,该文件不会在磁盘上损坏。但它可能会为读者腐败。一个简单的例子:你写了字符串test failed not
。读者可能会阅读test failed
,因为它在编写not
之前读取了文件。如果这是一个问题,您需要锁定。
3)多个作者,多个读者(无,一个或多个)
此处,该文件甚至可能在磁盘上损坏。想象一下两个作家:第一个尝试写test failed not
。第二次尝试写同样的东西。由于上下文切换,您最终可能会使用test failed
和test failed not not
。所以你需要锁定。
现在有些细节:
通常,文件系统以块的形式写入。块可能是4k大小。所以低于这个尺寸的任何东西都是原子地写的这再次意味着,那些只是以不到4k的块数记录数据的人,从来没有遇到过这个问题而且似乎并不关心。
所以基本上,你甚至不想锁定。你只想要原子写作。由于文件系统(内核)不保证这些,您必须自己实现它们。所以你需要锁定。 flock()
只是创建和管理锁的一种可能性。