如果脚本超时或在锁定时终止,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);
}

锁会怎样?

其实我觉得不是自动释放的。为确保您的脚本不会将文件保持在锁定状态,您将需要注册一个关闭回调并解锁那里的所有锁定文件。

register_shutdown_function('unlock_files');

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

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

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

PHP Version 5.4.34
Linux 3.12.35.1418868052 #1 SMP x86_64

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