按照这个答案限制只运行一个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);
?>
Run Code Online (Sandbox Code Playgroud)
我的问题是,flock如果进程在中间do_something_lengthy(),即在调用之前死亡,那么'ed one.txt文件是否会被解锁flock($fp, LOCK_UN)?
我制作了这个小脚本来测试它
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();
}
Run Code Online (Sandbox Code Playgroud)
对我来说,操作系统在脚本完成执行后大约2-5秒解锁文件,如果它没有抛出任何异常,并且由于抛出异常而在脚本停止后最多2-5秒.
请记住,从php 5.3.2开始fclose($fh)不会解锁文件,文件将保持锁定状态,除非你用php解锁它,否则你将不得不等待操作系统解锁它,如果有一些bug可能永远不会发生(这发生在我身上)
解锁文件:
flock($fh,LOCK_UN);
Run Code Online (Sandbox Code Playgroud)
关闭文件句柄(脚本完成执行时将自动调用)
fclose($fh);
Run Code Online (Sandbox Code Playgroud)
锁定文件而LOCK_NB不会导致脚本等待文件解锁.