当进程意外死亡时,植绒文件会被解锁吗?

2022-08-30 19:14:58

按照这个答案,只限制一个php脚本的实例运行:

<?php

  $fp = fopen("/tmp/one.txt", "r+");
  if (flock($fp, LOCK_EX)) {
    //
    do_something_lengthy();
    //
    flock($fp, LOCK_UN);
  } else {
    echo "Couldn't get the lock!";
  }

  fclose($fp);

?>

我的问题是,如果进程在 中间死亡,即在调用之前,“ed one.txt文件会被解锁吗?flockdo_something_lengthy()flock($fp, LOCK_UN)


答案 1

根据 PHP 内部使用的 flock() 手册页,当使用 调用或使用 关闭描述符时,将释放锁。flock()LOCK_UNfclose()

脚本终止后,PHP 或操作系统将关闭打开的文件描述符,从而释放您可能拥有的锁。

由于上述行为,这个提交(5.3)和这个(5.2)不再在PHP本身中进行解锁。


答案 2

我制作了这个小脚本来测试它

header('Content-type:text/plain; charset=utf-8');

$dir = dirname(__FILE__);
$file = $dir.'/testflock.lock';
$fh = fopen($file, 'w+');

$unlocked = flock($fh, LOCK_EX | LOCK_NB);
echo 'Locked: '.$file.' ';var_dump(!$unlocked);echo PHP_EOL;
if($unlocked){
    sleep(10);
    throw new Exception();
}

对我来说,如果没有引发任何异常,操作系统在脚本完成执行后大约2-5秒解锁文件,并且在脚本停止后最多2-5秒由于抛出异常。

请记住,从php 5.3.2开始,文件将不会解锁,除非您使用php解锁它,否则文件将保持锁定状态,或者您将不得不等待操作系统解锁它,如果存在某些错误,这可能永远不会发生(这发生在我身上)fclose($fh)

要解锁文件:

flock($fh,LOCK_UN);

关闭文件句柄(脚本完成执行时将自动调用)

fclose($fh);

在没有的情况下锁定文件将导致脚本等待文件解锁。LOCK_NB


推荐