我读过 php 的手册页 http://php.net/manual/en/function.file-get-contents.php#120389关于“file_get_contents”函数,它没有说明“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);
?>
我已经测试成功了。我还测试过,即使文件已被锁定flock()
只LOCK_EX
可以让另一个 php 进程通过以下方式读取该文件file_get_contents
正如评论所暗示的那样。
然而,这就是我询问信息的主要原因,我读过一个名为“在 PHP 中读取锁定的文件” https://ivopetkov.com/b/reading-locked-files-in-php/,其声称以下内容file_get_contents
和文件锁定。
使用 file_get_contents() 读取锁定的文件
这是在锁定和修改文件时读取文件的最糟糕方法之一,因为:
- file_get_contents() 将返回一个空字符串(如“”)
- filesize() 将返回写入文件的实际字节数
我这个说法正确吗?我运行一些测试,独占锁定一个文件并不断写入它,同时使用file_get_contents
在另一个 php 进程中读取文件并且没有经历如上所述的行为
file_get_contents() 将返回一个空字符串(如“”)
一般来说,php 是这样吗?file_get_contents
不关心咨询文件锁定。
另外,我是否正确地假设 file_get_contents 返回的空字符串的网页中提出的声明为空“”,仅当文件为空或暂时为空(修改时)但通常不为空(仅适用于该文件的原因flock()
ed)?