php 的 file_get_contents 是否忽略文件锁定?

hum*_*ace 6 php flock

我已经阅读了关于“file_get_contents”函数的php手册页,它没有说明“file_get_contents”在 php 文件锁定方面的行为方式。然而在评论部分,用户克里斯建议

file_get_contents 通常不尊重 PHP 的群锁定,即建议锁定。

您可以使用一些额外的代码来解决此问题以请求共享锁,例如...

<?php
$tmp = fopen($path, 'rb');
@flock($tmp, LOCK_SH);
$contents = file_get_contents($path);
@flock($tmp, LOCK_UN);
fclose($tmp);
?>
Run Code Online (Sandbox Code Playgroud)

我已经成功测试过。我还测试过,即使文件已被以flock()独占方式锁定,LOCK_EX也有可能让另一个 php 进程file_get_contents按照评论所建议的方式读取文件。

但是,这也是我询问信息的主要原因,我阅读了一个标题为“在 PHP 中读取锁定的文件”的网页,该网页声称以下关于file_get_contents文件锁定的内容。

使用 file_get_contents() 读取锁定的文件

这是在文件被锁定和修改时读取文件的最糟糕的方法之一,因为:
- file_get_contents() 将返回一个空字符串(如“”)
- filesize() 将返回写入文件的实际字节数

我这个说法正确吗?我运行了一些测试,专门锁定一个文件并不断写入它,同时file_get_contents在另一个 php 进程中使用它来读取文件并且没有遇到如上所述的行为

file_get_contents() 将返回一个空字符串(如“”)

一般来说,phpfile_get_contents不关心咨询文件锁定是真的吗?另外,我是否正确假设 file_get_contents 返回的空字符串的网页中的声明为空“”,仅当文件为空或临时为空(被修改时)但通常不为空(仅适用于文件被flock()编辑的原因)?

Chr*_*anM 4

集群相对独立于文件操作,您甚至可以对锁定的文件使用fopen。作为开发人员,您有责任在需要锁的地方检查/使用集群。

但是,在这方面,确实file_get_contents没有内置方法可以在读取文件时获取读锁。因此,解决方法将是可行的方法。

file_put_contents不过,允许您获得写入锁。