ファイル システムを使用して、アプリケーション全体の永続的なシングルトンを作成します (アプリケーションはデータベースを使用しません)。ページの読み込みに 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 を取り除くと問題は完全に解消されますが、コードが安全ではなくなります。
何かアドバイス?
アプリケーション全体の永続的なシングルトンを作成するより良い方法を知っている人はいますか?