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

时间:2018-03-13 18:05:27

标签: php flock

我已经在'file_get_contents'函数中读取了php的manual page,该函数没有说明'file_get_contents`在php的文件锁定方面的行为。但是在评论部分,用户Chris建议

  

file_get_contents通常不会尊重PHP的flock锁定,即   咨询锁定。

     

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

<?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和文件锁定方面的以下内容。

  

使用file_get_contents()

读取锁定的文件      

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

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

  

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

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

1 个答案:

答案 0 :(得分:3)

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

但是在这方面是的,file_get_contents在读取文件时没有内置的获取读锁的方法。所以解决方法就是要走的路。

file_put_contents允许你获得写作锁定。