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

Php 什么时候真的需要flock()?,php,locking,Php,Locking,我认为,只要可能同时读取和/或更新文件,就应该使用文件锁定机制 但是,我看到,例如,Monolog处理程序StreamHandler不会聚集()文件,那么多个并发写入呢? 另一个例子是Laravel的文件系统类: 你的问题有点含糊,但我还是想回答 1) 没有作者,多个读者 这种情况不需要任何锁定,因为没有数据被更改 2) 一个作者,多个读者(无,一个或多个) 如果没有磁盘错误,文件不会在磁盘上损坏。但对读者来说,它可能会变得腐败。一个简单的例子:您编写了字符串test failed not。读取

我认为,只要可能同时读取和/或更新文件,就应该使用文件锁定机制

但是,我看到,例如,Monolog处理程序StreamHandler不会聚集()文件,那么多个并发写入呢?


另一个例子是Laravel的文件系统类:

你的问题有点含糊,但我还是想回答

1) 没有作者,多个读者

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

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

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

3) 多个编写器、多个读卡器(无、一个或多个)

在这里,文件甚至可能在磁盘上损坏。想象两个编写器:第一个尝试编写
测试失败而不是
。第二个尝试写同样的东西。由于上下文切换的原因,您可能会导致
测试失败
测试未失败
。所以你需要锁定

以下是一些细节:

通常,文件系统以块的形式写入。一个块的大小可能是4k。因此,小于该大小的任何内容都是以原子方式编写的。这再次意味着,那些只将数据记录在小于4k的数据块中的人永远不会有这个问题,而且似乎并不在意


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

这些库如何产生并发写入?PHP在默认情况下是单线程的,因此除非以某种方式显式并行化(无论是在进程还是系统级别),否则无法生成并发写入。这就是你想要的答案吗?@Jon我一定是把线程和并发编程混淆了(在这个上下文中是并发http请求),对吧?所以你是说并发写入不能发生在异步http请求中。当然,它们可以发生。但是这些代码不知道存在并发HTTP请求(或者任何HTTP请求),也不知道它们都在写入同一个文件,所以它们不会锁定。如果你想锁定,就用合适的东西把它们包起来。抱歉@Jon听不懂你最后的评论。首先你说“这些库如何产生并发写入?”然后你说“当然,它们可以发生”(谈论并发http请求,而不是进程的并行化),这似乎是相反的。然后你说代码不知道请求是否写入同一个文件,这就是为什么我问是否应该使用flock()。根据您的第一条评论,我不需要flock()。是的,在此场景中您应该使用
flock
。困惑是因为问题根本不清楚——你脑子里的信息比你大声说出来的要多。“多个并发写入如何?”可以用多种方式解释。例如,“为什么这些库
flock
,以确保它们即使在存在多个并发写入的情况下也能正常工作?”。