php flock和fread和fwrite

qwe*_*ymk 7 php locking file-locking flock

我看到有人像这样使用flock:

if (!$fp = fopen($file_name, 'wb'))  
{  
    return FALSE;  
}  

if (flock($fp, LOCK_EX))  
{  
    fwrite($fp, serialize($data));  
    flock($fp, LOCK_UN);  
}
Run Code Online (Sandbox Code Playgroud)

这个:

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)));  
}  
Run Code Online (Sandbox Code Playgroud)

但是,其他人是否有可能在fopen通话和flock通话之间编辑文件?和同样的问题fread


编辑:
澄清为什么我问这个...我在这里的代码基于我的问题,在一个mysql缓存的情况下,什么是阻止20人同时能够访问该文件,如果他们所有可以介入fopen和flock之间?

那个代码是万无一失的吗?

pil*_*row 6

你问:

是否有其他人可以在fopen调用和flock调用之间编辑文件?和fread相同的问题

是的,不,也许吧.简短回答:假设"是"并谨慎行事.

是的,因为传统的基于flock()的锁定仅仅是建议性的,所以其他进程(甚至是同一个进程)可以自由地忽略锁定.在实践中,这不是问题,因为flock()由行为良好的客户端代码使用 - 在获得LOCK_SH之前不会读取,除非您在应用程序上获得LOCK_EX,否则不会写入 - 具体文件.

不,PHP的flock()实现在某些操作系统上可能是必需的,根据文档,这可能还需要文件系统的支持(例如,与Linux下的mand选项一样).因此,其他进程无法忽视这些锁.

也许,因为PHP 5中的流子系统实现了一些超出操作系统提供的锁定簿记.例如,这可以防止相同的过程(但不是另一个过程)忽略其自身的其他咨询锁定.该行为可能会惊讶一些.即便如此,这种锁定在不相关的过程之间也不是强制性的.

为了便于携带,只需假设最弱的语义(上面的"是")并将flock()限制在预先选择的特定于应用程序的锁定文件上的良好代码.