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