[英]php flock and fread and fwrite
我看到有人像这样使用flock:
if (!$fp = fopen($file_name, 'wb'))
{
return FALSE;
}
if (flock($fp, LOCK_EX))
{
fwrite($fp, serialize($data));
flock($fp, LOCK_UN);
}
这个:
if (!$fp = @fopen($file_name, 'rb'))
{
return FALSE;
}
flock($fp, LOCK_SH);
$data = '';
if (filesize($file_name) > 0)
{
$data = unserialize(fread($fp, filesize($file_name)));
}
但是有没有其他人可以在fopen
调用和flock
调用之间编辑文件? 和fread
相同的问题
编辑:
为了澄清我为什么要问这个...我在这里的代码基于我的问题,在一个mysql缓存的情况下,什么是阻止20人同时能够访问该文件,如果他们都可以获得在fopen和flock之间?
那个代码是万无一失的吗?
你问:
是否有其他人可以在fopen调用和flock调用之间编辑文件? 和fread相同的问题
是的,不,也许吧。 简短回答:假设“是”并谨慎行事。
是的,因为传统的基于flock()的锁定仅仅是建议性的 ,所以其他进程(甚至是同一个进程)可以自由地忽略锁定。 在实践中,这不是问题,因为flock()由行为良好的客户端代码使用 - 在获得LOCK_SH之前不会读取,除非您在应用程序上获得LOCK_EX,否则不会写入 - 具体文件。
不,PHP的flock()实现在某些操作系统上可能是必需的 ,根据文档 ,这可能还需要文件系统的支持(例如,与Linux下的mand选项一样)。 因此,其他进程无法忽视这些锁。
也许,因为PHP 5中的流子系统实现了一些超出操作系统提供的锁定簿记 。 例如,这可以防止相同的过程(但不是另一个过程)忽略其自身的其他咨询锁定。 这种行为可能会让人感到惊 即便如此,这种锁定在不相关的过程之间也不是强制性的。
为了便于携带,只需假设最弱的语义(上面的“是”)并将flock()限制在预先选择的特定于应用程序的锁定文件上的良好代码。
第一个片段是万无一失的,如果你无法锁定文件,你就不会写。 如果其他人在fopen()
和flock()
之间编辑了文件,你的文件句柄将指向最新的化身,因为fopen()
绑定到一个流,而不是一个'快照'。
第二个例子不能保证工作,因为没有检查flock()
的返回值,所以如果你没有获得锁,那么无论如何都将执行后续代码。
[编辑]删除了读者锁无关紧的声明,它确实如此,如下面的评论所述:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.