自动加载优化#

默认情况下,Composer 自动加载运行速度比较快。但是,由于 PSR-4 和 PSR-0 自动加载规则的设置方式,它需要检查文件系统才能最终解析类名。这会降低速度,但在开发环境中很方便,因为当您添加新类时,它可以立即被发现/使用,无需重新构建自动加载配置。

然而,问题是在生产环境中,您通常希望事情发生得越快越好,因为您可以在每次部署时重新构建配置,并且新类不会在部署之间随机出现。

为此,Composer 提供了一些优化自动加载的策略。

注意:不应该开发环境中启用任何这些优化,因为它们都会在添加/删除类时导致各种问题。在开发环境中,性能提升并不值得这种麻烦。

优化等级 1:类映射生成#

如何运行?#

有一些选项可以启用它

  • 在 composer.json 的 config 键内设置 "optimize-autoloader": true
  • 使用 -o / --optimize-autoloader 调用 installupdate
  • 使用 -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 调用 installupdate
  • 使用 -a / --classmap-authoritative 调用 dump-autoload

它做了什么?#

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

此选项表示,如果类映射中没有找到某个类,那么它就不存在,自动加载器不应该尝试根据 PSR-4 规则在文件系统上查找。

权衡#

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

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

优化等级 2/B:APCu 缓存#

如何运行?#

有一些选项可以启用它

  • 在 composer.json 的 config 键内设置 "apcu-autoloader": true
  • 使用 --apcu-autoloader 调用 installupdate
  • 使用 --apcu 调用 dump-autoload

它做了什么?#

此选项添加了一个 APCu 缓存作为类映射的回退。但是,它不会自动生成类映射,因此如果您希望启用等级 1 优化,您仍然需要手动启用它。

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

权衡#

此选项需要 APCu,您可能可以使用也可能无法使用它。它还将 APCu 内存用于自动加载目的,但它使用起来很安全,不会像上面的权威类映射优化那样导致类无法找到。

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

发现错别字?此文档中是否有错误?分叉并编辑 它!