php - 为什么这个文件锁定功能会失败?
问题描述
我为一个通用函数编写了以下代码,以在一个经常运行的 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)
}
我现在怀疑数组不是保持文件指针活动/在范围内的正确方法。请指教!
我在考虑可变变量,但这听起来像一团糟。
解决方案
文件锁正在工作,但我错误地假设它会立即失败。相反,脚本正在等待释放锁。所以这就是脚本总是被锁定的原因。
推荐阅读
- python - 使用pytorch进行反向传播的两个操作有什么区别?
- regex - bash 正则表达式匹配与否
- python - 更改 2D Char 列表中的元素
- python - 使用xlwt python合并两个以上的单元格
- batch-file - 如何通过批处理文件随机化声音?
- node.js - SequelizeJS 如何使用 1 个模型并创建多个表?
- php - 在表格行内检查条件时更改背景颜色不起作用
- awk - 读取前几行中的字段以获取移动平均线
- javascript - React Portal 解决了什么问题?
- php - 致命错误:在 C:\xampp\htdocs\pdf\fpdi2\src\Fpdi.php 中找不到类 'setasign\Fpdi\FpdfTpl'