为什么此文件锁定功能失败?

时间:2018-11-28 22:36:30

标签: php locking flock

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

我现在怀疑数组不是将文件指针保持在作用域内的正确方法。请指教!

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

1 个答案:

答案 0 :(得分:0)

文件锁正在工作,但是我错误地假设它将立即失败。而是脚本正在等待释放锁。因此,这就是脚本始终获得锁定的原因。