我有一个用PHP编写的平台,并以下列方式在每个文件中存储一个类定义:
filename.php = lower(<class name>) + ".php"
我还使用自动加载函数来获取类名,并使用json生成的文件(通过我制作的自定义工具),加载包含类定义的特定文件(我之前尝试使用blob,但也是慢)。
为什么生成文件?因为在每个请求中对diretory树进行文件搜索以查找相应的类是IO密集型。
我生成的json类映射:
{
"homecontroller": "path/to/dir/homecontroller.php",
"database": "path/to/another/deep/dir/database.php"
}
今天这个加载json,解码和存储在数组中以在autoload中使用来查找类的过程需要大约30~50毫秒。
autoload,使用生成的json类map:
$_runtimefile = "packages/.runtime-map";
$classmap = json_decode(file_get_contents($_runtimefile));;
function __autoload($classname)
{
global $classmap;
$classidentifier = mb_strtolower($classname);
if(!array_key_exists($classidentifier, $classmap)) return;
$filename = __DIR__ . "/" . $classmap->{$classidentifier};
if(!file_exists($filename))
{
debug_print_backtrace();
throw new RuntimeException("File {$filename} not found for class {$classname}");
}
require_once($filename);
}
但我希望以更好的方式执行此操作,从性能的角度来看。有什么更好的方法来加载/拥有大型项目的类映射或自动加载以及我如何做到这一点?
其他信息:
答案 0 :(得分:1)
Composer可以开箱即用 - 构建一个或多个子目录中所有类的列表。
当涉及到实际自动加载它们时,还有许多可选的优化可用于缓存(non-)existence of files,因此不需要进一步检查。这些优化几乎总是只在部署得到控制的生产中有用。
答案 1 :(得分:0)
根据Elias Soares和Mark Baker的建议,我改写了我的代码,使用基于php数组的文件映射。
为了自动创建和重新创建php,我创建了一个在我的项目中运行良好的C#控制台程序。