首页 > PHP > Composer 中文文档 > 官方文章

3.2. 自动加载器优化

自动加载器优化

通常情况下,Composer 的自动加载器运行速度相对而言是比较快的。 但是,由于 PSR-4 和 PSR-0 的自动加载规则是在最终解析一个类之前需要去检查文件系统。这会导致自动加载的速度变得相当缓慢,但在开发环境中,这会是一种非常便捷的加载方式,因为当你新建了一个类时,加载器会立即发现并使用该类,而不需要你去重建自动加载器的配置。

这种加载规则导致的问题在生产环境中才真正体现出来,在生产环境中,你可以在每次部署之前非常轻松的重建配置,而且在部署之间不会随机出现新类,因此你不需要其一直检查文件系统,你通常都希望自动加载能尽可能快速的完成。

出于以上原因,Composer 提供了一些自动加载器的优化策略。

注意:你不应该在开发环境下使用本文所述的任何一种优化策略,因为这会导致你在添加或移除类时出现各种问题。事实上,在开发环境中应用这些设置所带来的性能提升和其所带来的问题相比,是远远不值得的。

优化级别1:类映射生成

怎么运行它呢?

有几个选项可以启用此功能:

  • 在 composer.json 的配置中设置 "optimize-autoloader": true
  • 使用 -o / --optimize-autoloader 调用安装或更新
  • 使用 -o / --optimize 调用 dump-autoload 

它有什么作用?

类映射生成实质上是将 PSR-4/PSR-0 规则转换为类映射规则。这使得一切都快很多,因为已知的类映射会立即返回路径,而 Composer 可以保证类在那里,因此不需要文件系统检查。

在 PHP 5.6+ 中,类映射也缓存在 opcache 中,这大大改善了初始化时间。如果确保启用了 opcache ,那么类映射应该会立即加载,类加载也会很快。

权衡

这种方法没有真正的权衡。它应该始终在生产中启用。

唯一的问题是它没有跟踪自动加载 (即,当它找不到给定的类时),因此那些回退到 PSR-4 的规则仍然有可能导致文件系统检查速度变慢。要解决此问题,存在两个二级优化选项,如果您对项目中不存在的类执行了大量的 class_exists 检查, 那么可以决定启用这两个选项。

优化级别 2/A :权威类映射

怎么启用它呢?

有几个选项可以启用此功能:

  • 在 composer.json 的 config 键中设置 "classmap-authoritative": true
  • 使用 -a / --classmap-authoritative 调用安装或更新
  • 使用 -a / --classmap-authoritative 调用  dump-autoload 

它有什么作用呢?

启用此选项会自动启用1级类映射优化。

这个选项很简单,它说如果在类图中找不到某些东西,那么它就不存在,自动加载器不应该根据 PSR-4 规则试图查看文件系统。

权衡

此选项能使自动装填器始终快速返回。另一方面,它还意味着如果由于某种原因在运行时生成类,则不允许自动加载。如果您的项目或任何依赖项执行此操作,那么您可能会在生产中遇到“未找到类”的问题。小心启用它。

注意:这不能与级别 2/B 优化结合使用。您必须选择一个,因为它们以不同的方式解决相同的问题。

优化级别 2/B: APCu 缓存

怎么启用它呢?

有个选项可以启用此功能:

  • 在 composer.json 的配置键中设置 "apcu-autoloader": true 
  • 使用 --apcu-autoloader 调用安装或更新
  • 使用  --apcu 调用 dump-autoload

它有什么作用?

此选项将 APCu 缓存添加为类映射的备用。它不会自动生成类映射,因此如果您愿意,仍需手动启用 1级优化。

无论是否找到类,该事实总是缓存在 APCu 中,因此可以在下一个请求时快速返回。

权衡

此选项需要 APCu ,它可能对您有用也可能不适用。它还使用 APCu 内存进行自动加载,但它是安全使用的,并且不会导致找不到类,如上面的权威类映射优化。

注意:这不能与级别 2/A 优化结合使用。您必须选择一个,因为它们以不同的方式解决相同的问题。