Symfony2慢速初始化时间
我已经在Ubuntu Server 12.04(64位)VM(VirtualBox)上运行Symfony2。 主机是一台MacBook Pro。 出于某种原因,我在开发模式(app_dev.php)中获得了非常长的请求时间。 我知道它在开发模式下比较慢,但是我每个请求说话5-7秒(有时甚至更慢)。 在我的Mac上,我在开发模式下获得200ms左右的请求时间。
在Symfony2分析器中查看我的时间线后,我注意到约95%的请求时间是“初始化时间”。 这是什么? 有什么原因可能会这么慢?
此问题仅适用于开发模式下的Symfony2,而不适用于虚拟机上运行的其他任何站点,甚至不适用于生产模式下的Symfony2。
我看到这个(但是它似乎不回答我的问题。
我默认情况下从Symfony2有5到30秒的响应。 现在在开发环境〜500ms 。
然后我在php.ini
修改了以下内容:
- 设置
realpath_cache_size = 4M
(或更多) - 完全禁用
XDebug
(用phpinfo
testing) - realpath_cache_ttl = 7200
- 启用并正确设置
OPcache
(或APC) - 重新启动Apache以便重新加载php.ini
而且,在开发模式下,响应时间不到2秒! 希望能帮助到你。
之前: 6779毫秒
之后: 1587毫秒
Symfony2从数千个文件读取类,这是一个缓慢的过程。 当使用小型PHP实时pathcaching时,如果文件path不在PHP的实时pathcaching中,则每次在开发环境中发出新的请求时,都需要逐一parsing文件path。 对于Symfony2,实际pathcaching默认太小了。 当然,这当然不是问题。
caching元数据:
caching元数据(例如映射)对于进一步提高性能也非常重要:
doctrine: orm: entity_managers: default: metadata_cache_driver: apc query_cache_driver: apc result_cache_driver: apc
您需要为此启用APCu
。 它是没有字节码caching的APC
, OPCache
已经做了操作码caching。 OPCache
自PHP 5.5起build立。
—- 之后: 467毫秒—-
(在产品环境中,相同的响应是〜80ms)
请注意,这个项目使用了30多个捆绑包,拥有数以万计的代码行,几乎有100个自己的服务,所以0.5s在本地Windows环境中相当不错,只需进行一些简单的优化。
我找出了问题的原因(而不是Symfony2)。 出于某种原因在Ubuntu VM上,某些文件的修改时间不正确(即将来等)。 当symfony2使用filemtime()对它的registry检查这些时间时,它确定caching不再新鲜,并重build整个事情。 我还没有弄清楚为什么这样做呢。
我还需要禁用xdebug (v2.2.21)
debugging我的macbook上的apache2最大超时加载。 它是使用macports安装的:
sudo port install php54-xdebug.
在启用xdebug的情况下,每个页面都会运行最大加载时间,并且会发送超过最大超时消息的致命错误。 禁用时,所有内容都会在合理的预期时间内正常加载。 我来到这个使用MAMP,默认情况下没有启用xdebug,和apache2一样正常工作。 我可能会改变另一个debugging器,这是一个可怜的,因为xdebug以前工作得很好。
configuration:
- MacOSX 10.6.8
- macports 2.1.3
- Apache 2.2.24
- PHP 5.4
我们有同样的问题。 在这里,我们有10秒钟和更多的每个请求。 我看到,如果我删除bootstrap.php.cache中的以下行,所有时间都返回正常状态(298毫秒)。
foreach ($meta as $resource) { if (!$resource->isFresh($time)) { return false; } }
我们可能有错误的修改时间,但我们不知道如何解决。 有人知道一个解决scheme?
正如在https://stackoverflow.com/a/12967229/6108843所说,这种行为的原因可能是Ubuntu VM设置。 您应该按照https://superuser.com/questions/463106/virtualbox-how-to-sync-host-and-guest-time中的说明在主机和来宾操作系统之间同步date和时间。;
通过FTP将file upload到虚拟机时,文件修改date更改为主机的值。 所以这就是为什么filemtime()返回错误的值。
您可以移动APP/var/cache
/dev/shm/YourAppName/var/cache
。 但是,为了IDE自动完成和代码validation,也可以在本地文件中构build容器。 在app/AppKernel.php
:
public function getCacheDir() { return $this->getVarOrShmDir('cache/' . $this->getEnvironment()); } public function getLogDir() { return $this->getVarOrShmDir('logs'); } private function getVarOrShmDir($dir) { $result = dirname(__DIR__) . '/var/' . $dir; if ( in_array($this->environment, ['dev', 'test'], true) && empty($_GET['warmup']) && // to force using real directory add ?warmup=1 to URL is_dir($result) && // first time create real directory, later use shm file_exists('/bin/mount') && shell_exec('mount | grep vboxsf') // only for VirtualBox ) { $result = '/dev/shm/' . 'YourAppName' . '/' . $dir . '/' . $this->getEnvironment(); } return $result; }
我禁用了xdebug,并导致从17s(yea ..)到0.5s的加载时间减less。
在开发中页面加载速度缓慢时,我也遇到了问题,当你调整CSS或类似的东西时,这会非常令人沮丧。
经过一番挖掘,我发现对于我来说,问题是由Assetic重新编译每个页面加载的所有资源引起的:
通过禁用资产控制器的使用,我能够大幅增加我的页面加载。 但是,正如上面的链接所述,只要您对其进行更改(或对其进行监视),就需要重新生成资产。
在app_dev中,所有的caching和自动加载都是从头开始的,我发现在dev中最慢的是orm。 我回避使用ORM,主要侧重于DBA,因为它,虽然我可能不应该。 Orm在sf2中用得相当多。 我的猜测是orm是什么让你在开发中最慢。 看看你的开发configuration和prodconfiguration之间的区别。 但是,一些调整到你的开发configuration可以使开发更快捷和愉快..只是尝试和意识到你在做什么。 例如,closures树枝控制器,然后修改大量的模板将是一种令人沮丧的。 您需要继续清理caching。 但是就像你提到的那样,只有它的开发者,当它的上线时间,symfony会为你加速。