如何提高自动加载效果

时间:2017-11-23 12:45:08

标签: php json performance

我有一个用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);
}

但我希望以更好的方式执行此操作,从性能的角度来看。有什么更好的方法来加载/拥有大型项目的类映射或自动加载以及我如何做到这一点?

其他信息:

  • 该项目有300个班级。
  • 目前,一个简单的请求在localhost中至少需要30~50毫秒。

2 个答案:

答案 0 :(得分:1)

Composer可以开箱即用 - 构建一个或多个子目录中所有类的列表。

当涉及到实际自动加载它们时,还有许多可选的优化可用于缓存(non-)existence of files,因此不需要进一步检查。这些优化几乎总是只在部署得到控制的生产中有用。

答案 1 :(得分:0)

根据Elias Soares和Mark Ba​​ker的建议,我改写了我的代码,使用基于php数组的文件映射。

为了自动创建和重新创建php,我创建了一个在我的项目中运行良好的C#控制台程序。