Symfony2慢速初始化时间

时间:2012-10-15 23:24:45

标签: performance ubuntu symfony virtualbox

我在Ubuntu Server 12.04(64位)VM(VirtualBox)上运行Symfony2。主持人是MacBook专业版。出于某种原因,我在开发模式(app_dev.php)中获得了非常长的请求时间。我知道它在开发模式下速度较慢,但​​每个请求我说5-7秒(有时甚至更慢)。在我的Mac上,我在开发模式下获得200ms左右的请求时间。

在Symfony2分析器中查看我的时间线后,我注意到~95%的请求时间是“初始化时间”。这是什么?有什么原因可能会这么慢?

此问题仅适用于开发模式下的Symfony2,而不适用于我在VM上运行的任何其他站点,甚至不适用于生产模式下的Symfony2。

我看到了这个(http://stackoverflow.com/questions/11162429/whats-included-in-the-initialization-time-in-the-symfony2-web-profiler),但它似乎没有回答我的问题。

9 个答案:

答案 0 :(得分:123)

默认情况下,我有来自Symfony2的5-30秒响应。 在开发环境中现在是~500ms

然后我修改了php.ini中的以下内容:

  • 设置realpath_cache_size = 4M (或更多)
  • 完全停用XDebug(使用phpinfo测试)
  • realpath_cache_ttl = 7200
  • 启用并正确设置OPcache(或APC)
  • 重新启动Apache以重新加载php.ini

瞧,在开发模式下,回复不到2秒!希望它有所帮助。

之前: 6779毫秒 enter image description here

之后: 1587 ms

enter image description here

Symfony2从数千个文件中读取类,这是一个缓慢的过程。当使用小型PHP实时路径缓存时,如果它们不在PHP的实际路径缓存中,则每次在开发环境中发出新请求时,都需要逐个解析文件路径。 Symfony2默认情况下,实际路径缓存太小。在产品中,这当然不是问题。

缓存元数据:

缓存元数据(例如映射)对于进一步提升性能也非常重要:

doctrine:
    orm:
        entity_managers:
            default:
                metadata_cache_driver: apc
                query_cache_driver: apc
                result_cache_driver: apc

您需要为此启用APCu。它是APC没有字节码缓存,因为OPCache已经进行了操作码缓存。自PHP 5.5开始构建OPCache

---- 之后: 467 ms ----

(在prod环境中,相同的响应是~80 ms)

enter image description here

请注意,这个项目使用30多个捆绑包,拥有数万行代码,几乎有100个自己的服务,因此只需几个简单的优化,0.5s在本地Windows环境中相当不错。

答案 1 :(得分:14)

我找出问题的原因(而不是Symfony2)。由于某些原因,在ubuntu VM上,某些文件的修改时间不正确(即将来等)。当symfony2使用filemtime()针对其注册表检查这些时间时,它确定缓存不再是新鲜的并且它重建整个事物。我还没弄清楚为什么会这样做。

答案 2 :(得分:4)

我还需要禁用xdebug (v2.2.21)来调试我的macbook上的apache2 max timeout loading。它是使用macports安装的:

sudo port install php54-xdebug.

启用xdebug后,每个页面都会耗尽最大加载时间,并且会发送致命错误,超出调度的最大超时消息。禁用时,一切都在合理的预期时间内正常加载。我使用MAMP来实现这一点,默认情况下没有启用xdebug,并且apache2像往常一样快速运行。我可能会换另一个调试器,这很糟糕,因为xdebug以前工作正常。

配置:

  • MacOSX 10.6.8
  • macports 2.1.3
  • Apache 2.2.24
  • php 5.4

答案 3 :(得分:4)

我们遇到同样的问题。 在这里,每个请求我们有10秒或更多。 我看看我是否删除了bootstrap.php.cache中的以下行,所有时间都返回正常状态(298 ms)。

foreach ($meta as $resource) { 
if (!$resource->isFresh($time)) {
return false;
}
}

我们可能有错误的修改时间,但我们不知道如何修复。有人知道解决方案吗?

答案 4 :(得分:2)

https://stackoverflow.com/a/12967229/6108843所述,此类行为的原因可能是Ubuntu VM设置。您应该按照https://superuser.com/questions/463106/virtualbox-how-to-sync-host-and-guest-time中的说明在主机和来宾操作系统之间同步日期和时间。

通过FTP将文件上传到VM时,文件修改日期会更改为主机的值。这就是为什么filemtime()返回错误的值。

答案 5 :(得分:2)

您可以移动APP/var/cacheв/dev/shm/YourAppName/var/cache。但是,对于IDE自动完成和代码验证,在本地文件中构建容器也是很好的。在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;
}

答案 6 :(得分:1)

我禁用了xdebug,导致加载时间从17秒减少到了0.5秒。

答案 7 :(得分:1)

我在开发过程中遇到了慢速页面加载的问题,当你调整CSS或类似东西时,这会非常令人沮丧。

经过一番挖掘,我发现对我来说问题是由Assetic引起的,它正在重新编译每个页面加载的所有资产:

http://symfony.com/doc/current/cookbook/assetic/asset_management.html#dumping-asset-files-in-the-dev-environment

通过禁用Assetic控制器,我能够大幅增加页面负载。但是,正如上面的链接所述,无论何时对资产进行更改(或对其进行设置),都需要重新生成资产。

答案 8 :(得分:-2)

在app_dev中,所有缓存和自动加载都是从头开始的,我发现开发中最慢的是orm。我回避使用orm并主要关注dbal因为它,尽管我可能不应该。 orm在sf2中使用了很多。我的猜测是,开发中最让你失望的是什么。看看你的dev config和prod config之间的区别。但是,对你的dev配置进行一些调整可以使开发变得更加快捷和愉快。只需尝试并注意你的行为。例如,关闭树枝控制器,然后修改很多模板将是一种令人沮丧的事情。您需要不断清理缓存。但就像你提到的那样,只有它的开发时间以及它的上线时间,symfony会为你加速。