如果脚本超时或在锁定时终止,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);
函数。
这个 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);
函数。