【发布时间】:2012-10-03 07:20:12
【问题描述】:
我目前正在使用 PHP 对我的框架进行编程(主要是出于教育原因,以及打发时间的一种方式)。我写了一个自动加载器,它会自动扫描目录树并检测其中的所有类,并按以下格式创建一个数组:
Array(
'MyAwesomeClass' => 'path/to/file/in/some/subdirectory/MyAwesomeClass.php',
'MyOtherAwesomeClass' => 'path/to/file/MyOtherAwesomeClass.php'
// ....
);
起初这很整洁。因为我不需要担心我把课程放在哪里。
但后来我发现这是非常资源密集型的。所以我创建了一个缓存机制,并将索引序列化并保存到文件中。这将 PHP 脚本的响应时间减少了至少 50%。但它带来了一些问题。
在框架的其他类中,我经常使用如下内容:
class_exists('MyAwesomeClassController');
问题是如果我添加了新类MyAwesomeClassController,该类还没有在索引中,class_exists 返回 false。现在的问题是每次向框架添加新类时,我都必须删除缓存文件(让自动加载器重新创建索引)。
我尝试的另一件事(有点老套):
在 Autoloader 类中,我检查了是否使用 class_exists() 调用了自动加载方法。如果是这种情况,我会重新创建索引以查看是否可以在某处找到请求的类。但这似乎并不奏效,因为有时 class_exists 是使用一个几乎不存在的类调用的,所以这与在每个请求上重新创建索引的解决方案基本相同。
有什么解决办法吗?还是我必须完全重写我的 Autoloader?
【问题讨论】:
-
移动班级时会发生什么?如何使缓存失效?
-
如果我将一个类移动到另一个目录,则需要重新创建索引并且缓存将无效。如果添加或删除类,缓存也将无效。
-
您尝试做的事情已经存在!看看:github.com/theseer/Autoload。您可以构建一个 autoload.php 文件。使用 ANT 很容易将其集成到您的部署中......
-
@MarkusI。我一定会仔细看看。
-
@MarkusI。我看了一眼。这并不能解决我的问题。如果我添加一个类,我必须运行
$ phpab。这基本上与我执行$ rm my-cache-file相同