php 的 file_get_contents 会忽略文件锁定吗?

Does php's file_get_contents ignore file locking?

我已经阅读了php关于'file_get_contents'函数的manual page,它没有说明'file_get_contents`相对于[=38=的行为方式]的文件锁定。然而在评论部分,用户 Chris 建议

file_get_contents does not normally respect PHP's flock locking, i.e. advisory locking.

You can workaround this with some extra code to request a shared lock, like...

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

我测试成功了。我还测试过,即使文件已被 flock() 独占锁定 LOCK_EX,也可以让另一个 php 进程通过 file_get_contents 读取文件,因为评论会有建议。

然而,这也是我询问信息的主要原因,我阅读了一个名为 "Reading locked files in PHP" 的网页,其中声称以下内容涉及 file_get_contents 和文件锁定。

Reading a locked file with file_get_contents()

This is one the worst way to read a file while it is locked and modified, because:
- file_get_contents() will return an empty string (like in "")
- filesize() will return the actual number of bytes written to the file

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

file_get_contents() will return an empty string (like in "")

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

flock相对独立于文件操作,你甚至可以对锁定的文件使用fopen。作为开发人员,您有责任 checking/using 在需要锁的任何地方蜂拥而至。

但是在这方面是的,确实 file_get_contents 在读取文件时没有 build-in 获取读取锁定的方法。所以解决方法就是要走的路。

file_put_contents 允许您获得写入锁。