当前位置:首页 > php > 正文内容

composer autoload自动加载性能优化指南

phpmianshi6个月前 (12-21)php234

简介

composer 提供的 autoload 机制使得我们组织代码和引入新类库非常方便,但是也使项目的性能下降了不少 。

composer autoload 慢的主要原因在于来自对 PSR-0 和 PSR-4 的支持,加载器得到一个类名时需要到文件系统里查找对应的类文件位置,这导致了很大的性能损耗,当然这在我们开发时还是有用的,这样我们添加的新的类文件就能即时生效。 但是在生产模式下,我们想要最快的找到这些类文件,并加载他们。

因此 composer 提供了几种优化策略,下面说明下这些优化策略。

第一层级(Level-1)优化: 生成 classmap

-o 等同于 --optimize

composer dump-autoload -o

原理:

这个命令的本质是将 PSR-4/PSR-0 的规则转化为了 classmap 的规则, 因为 classmap 中包含了所有类名与类文件路径的对应关系,所以加载器不再需要到文件系统中查找文件了。可以从 classmap 中直接找到类文件的路径。

注意事项

建议开启 opcache , 这样会极大的加速类的加载。
php5.5 以后的版本中默认自带了 opcache 。

这个命令并没有考虑到当在 classmap 中找不到目标类时的情况,当加载器找不到目标类时,仍旧会根据PSR-4/PSR-0 的规则去文件系统中查找

第二层级(Level-2/A)优化:权威的(Authoritative)classmap

-a 等同于 --classmap-authoritative

composer dump-autoload -a


原理

执行这个命令隐含的也执行了 Level-1 的命令, 即同样也是生成了 classmap,区别在于当加载器在 classmap 中找不到目标类时,不会再去文件系统中查找(即隐含的认为 classmap 中就是所有合法的类,不会有其他的类了,除非法调用)

注意事项

如果你的项目在运行时会生成类,使用这个优化策略会找不到这些新生成的类。

第二层级(Level-2/B)优化:使用 APCu cache

 composer dump-autoload --apc

原理:

使用这个策略需要安装 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是比较好的选择。

几个提示

  • Level-2的优化基本都是 Level-1 优化的补充,Level-2/A 主要是决定在 classmap 中找不到目标类时是否继续找下去的问题,Level-2/B 主要是在提供了一个缓存机制,将在 classmap 中找不到时,将从文件系统中找到的文件路径缓存起来,加速后续查找的速度。

  • 在执行了 Level-2/A 时,表示在 classmap 中找不到不会继续找,此时 Level-2/B 是不会生效的。

  • 不论哪种情况都建议要开启 opcache, 这会极大的提高类的加载速度,我目测有性能提升至少 10倍。


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

phpstorm2020.3.1最新永久破解方法

phpstorm又更新了,截至目前为止,官网的最新版本为phpstorm2020.3.1,这次phpstorm的更新UI界面就有了很大的变化,主要是添加了对PHP8的支持,具体的可以去官网去了解哈。同...

PHP内核分析之生命周期(三)

一、概览PHP生命周期有五个阶段,分别为模块初始化阶段、请求初始化阶段、执行阶段、请求关闭阶段、模块关闭阶段。只是不同SAPI模式下,请求的情况略有不同,比如FastCGI下只经历了一次模块初始化阶段...

记一次tp3.2.3因fetch导致的漏洞处理过程

记一次tp3.2.3因fetch导致的漏洞处理过程

问题描述:最近发现百度收录大幅度下降,并出现大量5xx错误,有些收录页面直接跳转到其他网站,如下图:问题追查1.根据以往经验首先怀疑网站被植入或者挂马      &nbs...

PHP7的垃圾回收机制

PHP7的垃圾回收机制

垃圾回收机制垃圾回收机制是一种动态存储分配方案。它会自动释放程序不再需要的已分配的内存块。 自动回收内存的过程叫垃圾收集。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻...

PHP数组实际占用内存大小的分析

1.数组正常的赋值是不会发生内存改变的,但是当赋值的新数组发生改动的时候,php就会新开辟内存给新的数组,这里会造成无谓的内存消耗。最好是不要直接这样赋值,如果非赋值不可的话,记得加上‘&’符...

PHP中 array_walk array_map array_filter区别

array_walk:array_walk — 使用用户自定义函数对数组中的每个元素做回调处理1. 用户自定义的函数处理每一个元素2. 直接修改原数组,不会创建新的数组3. 可以传递额外的参数更多信息...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。