.. index:: single: Performance; Byte code cache; OPcache; APC
Symfony很快,开箱即用。但是,如果你按照以下性能检查表中的说明优化服务器和应用,则可以加快速度。
- :ref:`使用OPcache缓存 <performance-use-opcache>`
- :ref:`配置OPcache以获得最佳性能 <performance-configure-opcache>`
- :ref:`不要检查PHP文件的时间戳 <performance-dont-check-timestamps>`
- :ref:`配置PHP实际路径缓存 <performance-configure-realpath-cache>`
- :ref:`优化Composer Autoloader <performance-optimize-composer-autoloader>`
如果你的生产服务器仍使用旧版APC PHP扩展而不是OPcache, 请在应用中安装 APCu Polyfill component 以启用与 APCu PHP functions 的兼容性, 并解锁对Symfony高级功能的支持,例如APCu缓存适配器。
OPcache存储已编译的PHP文件,以避免为每个请求重新编译它们。 有一些 字节码缓存 可用,但从PHP 5.5开始,PHP内置了 OPcache。 对于旧版本,最广泛使用的字节码缓存是 APC。
默认的OPcache配置不适用于Symfony应用,因此建议更改这些设置,如下所示:】
; php.ini
; maximum memory that OPcache can use to store compiled PHP files
opcache.memory_consumption=256
; maximum number of files that can be stored in the cache
opcache.max_accelerated_files=20000
在生产服务器中,除非部署新的应用版本,否则PHP文件永远不会变化。 但是,默认情况下,OPcache会检查已缓存的文件是否已发生变化。 此检查修改了一些可以避免的开销,如下所示:
; php.ini
opcache.validate_timestamps=0
每次部署后,你必须清空并重新生成OPcache的缓存。否则,你将看不到应用中所做的更新。 由于在PHP中CLI和Web进程不共享相同的OPcache,你无法通过在终端中执行某些命令来清除Web服务器OPcache。 以下是一些可能的解决方案:
- 重启Web服务器;
- 通过Web服务器调用
apc_clear_cache()
或opcache_reset()
函数 (即,在你通过Web执行的脚本中使用这些函数); - 使用 cachetool 工具从CLI控制APC和OPcache。
当相对路径转换为其实际的绝对路径时,PHP会缓存结果以提高性能。 会打开许多PHP文件的应用(例如Symfony项目),应至少使用以下值:
; php.ini
; maximum memory allocated to store the results
realpath_cache_size=4096K
; save the results for 10 minutes (600 seconds)
realpath_cache_ttl=600
在开发应用时使用的类加载器是为查找新的和更改的类做优化的。
在生产服务器中,除非部署新的应用版本,否则PHP文件不会变化。
这就是为什么你可以优化Composer的自动加载器来一次性扫描整个应用并构建一个“类映射”,它是所有类的位置的一个大数组,它存储在 vendor/composer/autoload_classmap.php
中。
执行此命令以生成类映射(并使其成为部署过程的一部分):
$ composer dump-autoload --optimize --no-dev --classmap-authoritative
--optimize
转储(dump)你的应用中使用的每个PSR-0和PSR-4兼容类;--no-dev
排除仅在开发环境中需要的类(例如测试);--classmap-authoritative
阻止Composer在文件系统中寻找那些没有出现在类映射中的类。