当文件被一个进程锁定时,PHP 植绒行为


php flock behaviour when file is locked by one process

让我们考虑一个示例 php 脚本,它通过用户输入删除一行:

$DELETE_LINE = $_GET['line'];
$out = array();
$data = @file("foo.txt");
if($data)
{
    foreach($data as $line)
        if(trim($line) != $DELETE_LINE)
            $out[] = $line;
}
$fp = fopen("foo.txt", "w+");
flock($fp, LOCK_EX);
foreach($out as $line)
    fwrite($fp, $line);
flock($fp, LOCK_UN);
fclose($fp); 

我想知道是否有某个用户当前正在执行此脚本并且文件"foo.txt"在同一时间或在其执行完成之前被锁定,如果其他用户调用此脚本,会发生什么?第二个用户进程会等待第一个用户解锁文件吗?还是第二个用户输入的行删除会失败?

如果在另一个进程锁定文件时尝试获取独占锁,则您的尝试将等到文件解锁。这就是锁定的全部意义。

请参阅flock()的 Linux 文档,其中描述了它如何跨操作系统工作。PHP 在后台使用 fcntl(),因此通常支持 NFS 共享。

没有超时。如果你想自己实现超时,你可以做这样的事情:

$count = 0;
$timeout_secs = 10; //number of seconds of timeout
$got_lock = true;
while (!flock($fp, LOCK_EX | LOCK_NB, $wouldblock)) {
    if ($wouldblock && $count++ < $timeout_secs) {
        sleep(1);
    } else {
        $got_lock = false;
        break;
    }
}
if ($got_lock) {
    // Do stuff with file
}