我为通用函数编写了以下代码,以在经常运行的php脚本中的类中获取基于文件的锁。
private static $flocks = [];
public static function getLock($fname) {
$fp = null;
try {
$fp = fopen($fname . '.lock', 'w');
if ($fp === false) return false;
} catch (\Exception $e) {
return false;
}
try {
if (!flock($fp, LOCK_EX | LOCK_NB)) return false;
} catch (\Exception $e) {
return false;
}
self::$flocks[$fname] =& $fp;
return true;
}
之后,我使用以下脚本进行了尝试:
$yy = self::getLock('snorlax');
if ($yy) {
echo("WAITING...\n");
sleep(10);
echo("DONE");
} else {
echo("UNABLE TO GET LOCK");
}
我的问题是,它总是会锁住。这是测试脚本末尾的静态数组的var_dump ...
array(1) {
["snorlax"]=>
resource(659) of type (stream)
}
我现在怀疑数组不是将文件指针保持在作用域内的正确方法。请指教!
我当时在考虑变量变量,但这听起来像是一团糟。
答案 0 :(得分:0)
文件锁正在工作,但是我错误地假设它将立即失败。而是脚本正在等待释放锁。因此,这就是脚本始终获得锁定的原因。