我在 Ubuntu Server 12.04(64 位)VM (VirtualBox) 上运行 Symfony2。主机是MacBook pro。出于某种原因,我在开发模式 (app_dev.php) 中的请求时间非常长。我知道它在开发模式下速度较慢,但我说每个请求需要 5-7 秒(有时甚至更慢)。在我的 Mac 上,在开发模式下我得到 200 毫秒左右的请求时间。
在 Symfony2 分析器中查看我的时间线后,我注意到大约 95% 的请求时间是“初始化时间”。这是什么?它可能如此缓慢的原因有哪些?
此问题仅适用于开发模式下的 Symfony2,不适用于我在 VM 上运行的任何其他站点,甚至不适用于生产模式下的 Symfony2。
我看到了这个 (http://stackoverflow.com/questions/11162429/whats-included-in-the-initialization-time-in-the-symfony2-web-profiler),但它似乎没有回答我的问题。
最佳答案
默认情况下,我从 Symfony2 收到 5-30 秒的响应。 现在在开发环境中是 ~500ms。
然后我在php.ini
中修改了以下内容:
- 设置
realpath_cache_size = 4M
(或更多) - 完全禁用
XDebug
(使用phpinfo
测试) - realpath_cache_ttl=7200
- 启用并正确设置
OPcache
(或APC) - 重新启动 Apache 以重新加载 php.ini
瞧,在开发模式下响应不到 2 秒!
之前:6779 毫秒
之后: 1587 毫秒
Symfony2 从数千个文件中读取类,这是一个缓慢的过程。使用小型PHP realpath缓存时,如果文件路径不在PHP的realpath缓存中,则每次在dev环境中发出新请求时,都需要逐一解析文件路径。对于 Symfony2,realpath 缓存默认太小。在产品中,这当然不是问题。
缓存元数据:
缓存元数据(例如映射)对于进一步提升性能也非常重要:
doctrine:
orm:
entity_managers:
default:
metadata_cache_driver: apc
query_cache_driver: apc
result_cache_driver: apc
您需要为此启用APCu
。它是没有字节码缓存的 APC
,因为 OPCache
已经进行了操作码缓存。 OPCache
自 PHP 5.5 起内置。
---- 之后: 467 毫秒----
(在生产环境中,相同的响应是~80 ms)
请注意,这个项目使用了 30 多个 bundle,有数万行代码,近百个自己的服务,所以 0.5s 在本地 Windows 环境上已经相当不错了,只需要一些简单的优化。
关于performance - Symfony2 缓慢的初始化时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12905404/