-1

ファイル システムを使用して、アプリケーション全体の永続的なシングルトンを作成します (アプリケーションはデータベースを使用しません)。ページの読み込みに 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 は呼び出されません)。
遅延はランダムですが、更新がヒットするとより頻繁に発生するようです.
flock を取り除くと問題は完全に解消されますが、コードが安全ではなくなります。

何かアドバイス?

アプリケーション全体の永続的なシングルトンを作成するより良い方法を知っている人はいますか?

4

2 に答える 2

1

if {} 句で $fh を閉じるのは誰ですか? 開いたままになっていませんか?その場合、ロック解除に時間がかかる場合があります。そうしないと、少なくともスクリプトの実行中は開いたままになります。

于 2009-07-14T14:07:04.853 に答える
0

LOCK_EX の代わりに LOCK_SH パラメーターを使用してロックを試みることができます。後で必要になった場合は、書き込みのためにロックすることができます。できるだけ早くロックを解除すると、他のプロセスが不必要にブロックされます。

于 2009-07-14T14:07:22.777 に答える