在 Symfony2 中,哪种 class 路径缓存方法性能更高:Composer class 映射或使用 APCu 的 ApcClassLoader?

In Symfony2, which classpath caching method is more performant: Composer class map or ApcClassLoader using APCu?

阅读 Symfony2 性能文档:http://symfony.com/doc/2.8/performance.html

我正在尝试找出哪种解决方案更适合缓存 class 名称路径。我正在使用 PHP7,所以 APC 不可用,只有 apcu 和 opcache。鉴于我对实施缓存或必须重新启动 Web 服务器的复杂性没有任何问题,哪个是最高性能的?此外,如果我确实使用 APC 自动加载器,app.php 代码仍然必须首先加载作曲家 autoload.php,创建 ApcClassLoader,然后注销初始自动加载器。清除 class 地图是否有意义,这样未使用的地图就不会浪费太多内存,即 运行: composer dump-autoload --no-dev?

用于设置自动加载的 'gold standard' 在生产环境中 正如 symfony 文档所说:composer dump-autoload --optimize --no-dev --classmap-authoritative

  • --optimize 转储应用程序中使用的所有 PSR-0 和 PSR-4 兼容 class。
  • --no-dev 排除仅在开发环境(例如测试)中需要的class。
  • --classmap-authoritative 防止 Composer 扫描文件系统以查找在 class 中找不到的 classes地图。

在开发中,这样的优化可能太多了,因为您编写的每个新 class 都至少需要一个 composer dump-autoload - 灵活性更有用。

一旦 classmap 被写入光盘一次,然后读回,它无论如何都可以通过 OpCache 获得,因此它实际上已经在 PHP 进程中 space 最大速度。

为了增加 OpCache 的使用速度,您可以做的另一件事是阻止它检查缓存文件的修改 - 这可以通过设置 opcache.validate_timestamps = false 关闭。如果文件被更改,那么您将不得不重新启动 PHP 服务器(php-fpm,或者如果您使用的是 Apache mod_php),否则会使 OpCache 缓存无效。

--classmap-authoritative隐式启用--optimize。所以,这样的命令就够了composer dump-autoload --no-dev --classmap-authoritative。但是使用 --classmap-authoritative 你可以获得 class not found 异常。如果你安装了 APCu,你可以使用 composer dump-autoload --no-dev --optimize --apcu.