我使用文件系统来创建应用程序范围的持久单例(应用程序不使用数据库)。有时,加载一个页面需要 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)。
延迟是随机的,但似乎在刷新时发生得更频繁。
摆脱羊群完全消除了这个问题,但它也使代码不安全。
有什么建议吗?
有谁知道创建应用程序范围的持久单例的更好方法?