自动加载器优化
默认情况下,Composer自动加载器运行速度相对较快。然而,由于PSR-4和PSR-0自动加载规则的设置方式,它需要先检查文件系统,才能最终解析类名。这会在很大程度上拖慢速度,但在开发环境中很方便,因为当你添加一个新类时,无需重新构建自动加载器配置,就能立即发现并使用该类。
然而问题在于,在生产环境中,你通常希望一切都能尽可能快地进行,因为你可以在每次部署时重新构建配置,而且新的类不会在两次部署之间随机出现。
出于这个原因,Composer 提供了一些优化自动加载器的策略。
注意:在开发过程中,不应启用任何这些优化,因为在添加/删除类时,它们都会导致各种问题。在开发环境中,性能提升并不值得为此付出这些麻烦。
优化级别 1:类映射生成
Section titled “优化级别 1:类映射生成”如何运行它?
Section titled “如何运行它?”有几种方法可以启用此功能:
- 在composer.json的config键中设置
"optimize-autoloader": true - 使用
install或update并带上-o/--optimize-autoloader参数 - 使用
-o/--optimize调用dump-autoload
它有什么作用?
Section titled “它有什么作用?”类映射生成本质上是将PSR-4/PSR-0规则转换为类映射规则。这会使一切都快得多,因为对于已知的类,类映射会立即返回路径,而且Composer可以保证该类存在于其中,因此不需要进行文件系统检查。
在PHP 5.6及以上版本中,类映射也会缓存在操作码缓存(opcache)中,这极大地缩短了初始化时间。如果确保启用了操作码缓存,那么类映射几乎能立即加载,类加载速度也会很快。
这种方法没有实际的权衡问题。在生产环境中应该始终启用它。
唯一的问题是它不会跟踪自动加载失败的情况(即当它找不到特定类时),因此这些情况会退回到PSR-4规则,仍然可能导致缓慢的文件系统检查。为解决此问题,有两个二级优化选项可供选择,如果你的项目中有大量针对不存在的类进行的class_exists检查,你可以决定启用其中任何一个。
优化级别 2/A:权威类映射
Section titled “优化级别 2/A:权威类映射”如何运行它?
Section titled “如何运行它?”有几种启用此功能的选项:
- 在composer.json的config键中设置
"classmap-authoritative": true - 调用
install或update时使用-a/--classmap-authoritative - 使用
-a/--classmap-authoritative调用dump-autoload
它有什么作用?
Section titled “它有什么作用?”启用此功能会自动启用1级类映射优化。
此选项表示,如果在类映射中未找到某内容,则该内容不存在,自动加载器不应尝试根据PSR-4规则在文件系统中查找。
此选项会使自动加载器始终快速返回。但另一方面,这也意味着如果某个类因某种原因在运行时生成,将不允许被自动加载。如果您的项目或任何依赖项存在这种情况,那么在生产环境中可能会遇到“类未找到”的问题。请谨慎启用此选项。
注意:这不能与2级/B级优化结合使用。你必须选择其中一种,因为它们以不同方式解决相同的问题。
优化级别 2/B:APCu 缓存
Section titled “优化级别 2/B:APCu 缓存”如何运行它?
Section titled “如何运行它?”有几种方法可以启用此功能:
- 在composer.json的config键中设置
"apcu-autoloader": true - 调用
install或update并附带--apcu-autoloader - 使用
--apcu调用dump-autoload
它有什么作用?
Section titled “它有什么作用?”此选项会添加一个APCu缓存作为类映射的备用方案。不过,它不会自动生成类映射,因此如果您需要,仍应手动启用1级优化。
无论是否找到类,这一事实都会始终缓存在APCu中,因此可以在下次请求时快速返回。
此选项需要APCu,而您可能有也可能没有该组件。它还会将APCu内存用于自动加载,但使用起来是安全的,不会像上面提到的权威类映射优化那样导致类无法找到。
注意:这不能与2级/A级优化结合使用。你必须选择其中一种,因为它们以不同方式解决相同问题。