阅读Symfony2性能文档:http://symfony.com/doc/2.8/performance.html
我正试图找出哪种解决方案更适合缓存类名路径。我使用的是PHP7,所以APC不可用,只有apcu和opcache。考虑到我在实现缓存或重新启动web服务器的复杂性方面没有任何问题,哪一个性能最好?此外,如果我使用APC自动加载器,app.php代码仍然必须首先加载composer autoload.php,创建ApcClassLoader,然后注销初始自动加载器。清除类映射以使未使用的映射不会浪费太多内存,即运行:composer dump-autoload --no-dev
,这有意义吗?
在生产中设置自动加载的"黄金标准"是符号文档所说的:composer dump-autoload --optimize --no-dev --classmap-authoritative
。
- --optimize转储应用程序中使用的每个PSR-0和PSR-4兼容类
- --no dev排除只在开发环境中需要的类(例如测试)
- --classmap authority阻止Composer扫描文件系统中未在类映射中找到的类
在开发中,这样的优化可能太多了,因为您编写的每个新类都至少需要一个composer dump-autoload
-而灵活性更有用。
一旦类映射被写入磁盘一次,然后被读取回来,它无论如何都可以通过OpCache获得,因此它实际上已经在PHP进程空间内以获得最大速度。
为了给OpCache的使用增加一些额外的速度,你还可以做一件事,阻止它检查缓存文件的修改——这可以通过设置opcache.validate_timestamps = false
来关闭。如果文件发生更改,则必须重新启动PHP服务器(PHP-fpm,如果使用mod_PHP则为Apache),或者以其他方式使OpCache缓存无效。
--classmap authority隐式启用--优化。所以,这样的命令就足够composer dump-autoload --no-dev --classmap-authoritative
了。但是使用--classmap authority可以获得class not found
异常。如果安装了APCu,则可以使用composer dump-autoload --no-dev --optimize --apcu
。