如果脚本超时或在锁打开时终止,PHP 文件锁定会发生什么情况


What happens to PHP file lock if the script times out or is terminated while the lock was on?

我的问题最好用这个PHP代码示例来说明:

$file = fopen($filePath, "wb");
if($file !== false)
{
    //Obtain exclusive lock
    if(flock($file, LOCK_EX))
    {
        //Script times out or is terminated here
        //say, due to it using too much RAM, etc.
        //...
        //Release exclusive lock
        flock($file, LOCK_UN);
    }
    fclose($file);
}

锁会怎样?

我刚刚在以下共享服务器上进行了一些测试:

PHP Version 5.4.34
Linux 3.12.35.1418868052 #1 SMP x86_64

我的结论是,一旦脚本完成运行,文件锁定就会自动释放,即使在出现致命错误、超时或内存不足错误终止脚本的情况下,或者如果我注释掉flock($file, LOCK_UN);函数。

我实际上认为它不会自动发布。为了确保脚本不会使文件处于锁定状态,您需要注册关闭回调并解锁所有锁定的文件。

register_shutdown_function('unlock_files');

其中clean_state是一个功能,可以遍历所有锁定的文件(因此您需要跟踪它们)并解锁它们。

当发生致命错误、超时或内存不足错误时,将调用关机函数。