【问题标题】:Why is this file locking function failing?为什么这个文件锁定功能会失败?
【发布时间】:2018-11-28 22:36:30
【问题描述】:

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

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

我在考虑可变变量,但这听起来很混乱。

【问题讨论】:

    标签: php locking flock


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多