首页 > 解决方案 > 为什么这个文件锁定功能会失败?

问题描述

我为一个通用函数编写了以下代码,以在一个经常运行的 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)
}

我现在怀疑数组不是保持文件指针活动/在范围内的正确方法。请指教!

我在考虑可变变量,但这听起来像一团糟。

标签: phplockingflock

解决方案


文件锁正在工作,但我错误地假设它会立即失败。相反,脚本正在等待释放锁。所以这就是脚本总是被锁定的原因。


推荐阅读