基于 composer 的classmap生成器

近期花了不少功夫在优化线上代码构建方案上, 过程中的一些心得会不定期更新.

先前的做法是发布之后调用一个yii的扩展, 生成Classmap文件, 包含了类名和绝对路径的映射关系.

这么做的好处自然是在 autoload 上最大限度地减轻消耗, 每个类加载 autoloader 仅仅需要检查一下 classmap , 剩下的工作交给 apc 就行了.

最近在进行 composer 迁移的过程中, 发现composer其实自带了这么一个功能: dump-autoload, 而且生成的 ClassMap 文件在运行时通过路径拼接, 而不是用相对路径, 同样不会影响到 apc 的缓存功能.

实现这个功能仅仅需要以下改动

composer.json

{
      "autoload" : {
              "classmap" : [
                          "src/components",
                          "src/controller"
               ]
      }
}

spec文件中加入

BuildRequires: t-search-composer-cli
/opt/tsearch/bin/composer dump-autoload

在应用初始化过程加入类似以下步骤

$classMap = require "vendor/composer/autoload_classmap.php";
Yii::$classMap  = array_merge( Yii::$classMap, $classMap);

对于已经用上composer的项目管理依赖的情况下, 这种做法自然不是需要的, composer 的 install 指定会自动完成 classmap 生成工作.

但是如果不需要依赖 composer 进行依赖管理的情况下, 通过 dump-autoload 指令来提供可用的 classmap, 简单而又效果显著.