composer 提供的 autoload 机制使得咱们组织代码和引入新类库很是方便,可是也使项目的性能降低了很多 。php
composer autoload 慢的主要缘由在于来自对 PSR-0 和 PSR-4 的支持,加载器获得一个类名时须要到文件系统里查找对应的类文件位置,这致使了很大的性能损耗,固然这在咱们开发时仍是有用的,这样咱们添加的新的类文件就能即时生效。 可是在生产模式下,咱们想要最快的找到这些类文件,并加载他们。缓存
所以 composer 提供了几种优化策略,下面说明下这些优化策略。composer
执行命令 composer dump-autoload -o
(-o 等同于 --optimize
)性能
这个命令的本质是将 PSR-4/PSR-0 的规则转化为了 classmap 的规则, 由于 classmap 中包含了全部类名与类文件路径的对应关系,因此加载器再也不须要到文件系统中查找文件了。能够从 classmap 中直接找到类文件的路径。优化
建议开启 opcache , 这样会极大的加速类的加载。
php5.5 之后的版本中默认自带了 opcache 。spa
这个命令并无考虑到当在 classmap 中找不到目标类时的状况,当加载器找不到目标类时,仍旧会根据PSR-4/PSR-0 的规则去文件系统中查找code
执行命令 composer dump-autoload -a
(-a 等同于 --classmap-authoritative
)进程
执行这个命令隐含的也执行了 Level-1 的命令, 即一样也是生成了 classmap,区别在于当加载器在 classmap 中找不到目标类时,不会再去文件系统中查找(即隐含的认为 classmap 中就是全部合法的类,不会有其余的类了,除非法调用)内存
若是你的项目在运行时会生成类,使用这个优化策略会找不到这些新生成的类。开发
执行命令 composer dump-autoload --apcu
使用这个策略须要安装 apcu 扩展。
apcu 能够理解为一块内存,而且能够在多进程中共享。
这种策略是为了在 Level-1 中 classmap 中找不到目标类时,将在文件系统中找到的结果存储到共享内存中, 当下次再查找时就能够从内存中直接返回,不用再去文件系统中再次查找。
在生产环境下,这个策略通常也会与 Level-1 一块儿使用, 执行composer dump-autoload -o --apcu
, 这样,即便生产环境下生成了新的类,只须要文件系统中查找一次便可被缓存 , 弥补了Level-2/A 的缺陷。
要根据本身项目的实际状况来选择策略,若是你的项目在运行时不会生成类文件而且须要 composer 的 autoload 去加载,那么使用 Level-2/A 便可,不然使用 Level-1 及 Level-2/B是比较好的选择。