当一个进程锁定文件时,php flock行为

aga*_*ggi 8 php

让我们考虑一个示例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); 
Run Code Online (Sandbox Code Playgroud)

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

Bar*_*mar 19

如果在另一个进程锁定文件时尝试获取独占锁,则尝试将等待文件解锁.这是锁定的全部要点.

请参阅Linux文档flock(),其中介绍了它在操作系统中的工作原理.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
}
Run Code Online (Sandbox Code Playgroud)

  • 请记住,在使用此技术时,请求锁定的不同进程不会处于严格的队列中.每次进程进入`sleep()`阶段时,它都会跳出队列,并在它休眠后返回到队列的末尾.这对您的应用程序来说可能没问题,但这只是意味着无法保证每个进程必须等待多长时间以及它们将以何种顺序运行. (3认同)