我已经在'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()
编辑的原因?)
答案 0 :(得分:3)
flock相对独立于文件操作,你甚至可以在锁定文件上使用fopen。作为开发人员,您负责在需要锁定的任何地方检查/使用flock。
但是在这方面是的,file_get_contents
在读取文件时没有内置的获取读锁的方法。所以解决方法就是要走的路。
file_put_contents
允许你获得写作锁定。