为什么flock偶尔会在Windows / NTFS上花费很长时间?

时间:2009-07-14 13:58:58

标签: php windows ntfs

我使用文件系统来创建应用程序范围的持久性单例(应用程序不使用数据库)。偶尔页面将需要1-2分钟加载,我已经将问题缩小到在获取单例实例的函数中使用flock。以下是代码的简化版本:(编辑:遗漏了原始帖子中代码中最重要的部分)

public static final function getInstance() {
  if (is_null(self::$instance) {
    $fh = fopen($filename, 'ab+');
    if (flock($fh, LOCK_EX)) {
      $N = filesize($filename); 
      if ($N > 0) {
        rewind($fh);
        $s = stream_get_contents($fh);
        $obj = unserialize($s);
      } else {
        $obj = new MyClass();
      }
      self::$instance = $obj;
      return $obj;
    } else {
      fclose($fh);
      trigger_error("could not create lock", E_USER_WARNING);
    }
  } else {
    return self::$instance;
  }
}

该代码目前正在运行我的开发机器,它使用XP和NTFS 始终创建锁(即不调用trigger_error) 延迟是随机的,但在刷新时似乎更经常发生 摆脱鸡群完全消除了这个问题,但它也使代码不安全。

有什么建议吗?

有没有人知道创建应用程序范围的持久单例的更好方法?

2 个答案:

答案 0 :(得分:1)

谁关闭了if {}子句中的$ fh?它不是敞开的吗?在这种情况下,解锁可能需要很长时间。 否则它将至少在脚本的持续时间内保持打开状态。

答案 1 :(得分:0)

您可以尝试使用LOCK_SH参数而不是LOCK_EX进行锁定。如果您以后发现需要,您仍然可以锁定写入。我会尽快释放锁,否则其他进程会不必要地阻塞。