我在Ubuntu服务器12.04(64位)VM(VirtualBox)上运行Symfony2。主持人是一位MacBookPro。由于某些原因,我在开发模式(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秒的回复。现在在dev环境中约为500毫秒。
然后我在php中修改了以下内容。ini
:
realpath\u cache\u size=4M
(或更大)瞧,在开发模式下,响应持续了2秒!希望能有帮助。
之后:1587毫秒
Symfony2从数千个文件中读取类,这是一个缓慢的过程。使用小型PHP realpath缓存时,如果文件路径不在PHP的realpath缓存中,则每次在开发环境中发出新请求时,都需要逐个解析文件路径。默认情况下,realpath缓存对于Symfony2太小。在prod中,这当然不是问题。
缓存元数据(例如映射)对于进一步提高性能也非常重要:
doctrine:
orm:
entity_managers:
default:
metadata_cache_driver: apc
query_cache_driver: apc
result_cache_driver: apc
您需要为此启用APCu
。它是没有字节码缓存的APC
,就像OPCache
已经有了操作码缓存一样OPCache
是自PHP5.5以来内置的。
(在prod环境中,相同的响应约为80毫秒)
请注意,这是一个使用30个捆绑包的项目,它有数万行代码,几乎有上百个自己的服务,因此0.5s在本地Windows环境中非常好,只需进行一些简单的优化。
我找出了问题的原因(而不是Symfony2)。由于某些原因,在ubuntu虚拟机上,某些文件的修改时间是不正确的(如将来等)。当symfony2使用filemtime()对其注册表检查这些时间时,它会确定缓存不再新鲜,并重建整个缓存。我还没弄明白它为什么要这么做。
我还需要禁用xdebug(v2.2.21)来调试macbook上的apache2最大超时加载。它是使用macports安装的:
sudo port install php54-xdebug.
启用xdebug后,每个页面都会耗尽最大加载时间,并会出现致命错误,超过发送的最大超时消息。禁用时,一切都只是在合理的预期时间内加载正常。我使用MAMP来实现这一点,默认情况下没有启用xdebug,apache2只是像往常一样快速工作。我可能会换另一个调试器,这是一个遗憾,因为xdebug以前工作得很好。
配置: