56

我在 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),但它似乎没有回答我的问题。

4

9 回答 9

127

默认情况下,我从 Symfony2 得到 5-30 秒的响应。现在在开发环境中约为 500 毫秒。

然后我修改了以下内容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 毫秒 ----

(在 prod 环境中,相同的响应约为 80 ms)

在此处输入图像描述

请注意,这个项目使用了 30 多个捆绑包,拥有数万行代码,近百个自己的服务,因此仅使用一些简单的优化,0.5 秒在本地 Windows 环境中是相当不错的。

于 2013-07-29T00:54:45.230 回答
15

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

于 2012-10-19T04:04:52.590 回答
4

我还需要禁用xdebug (v2.2.21)在我的 macbook 上调试 apache2 最大超时加载。它是使用 macports 安装的:

sudo port install php54-xdebug.

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

配置:

  • macOS 10.6.8
  • 端口 2.1.3
  • 阿帕奇 2.2.24
  • php 5.4
于 2013-03-12T14:54:57.160 回答
4

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

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

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

于 2015-05-07T08:30:50.970 回答
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() 返回错误值的原因。

于 2016-03-24T12:17:58.497 回答
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;
}
于 2016-05-21T08:54:07.937 回答
1

我禁用了 xdebug,它导致加载时间从 17 秒(是的..)减少到 0.5 秒。

于 2013-02-13T13:34:23.850 回答
1

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

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

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

通过禁用 Assetic 控制器,我能够大大增加我的页面负载。但是,正如上面的链接所述,这是以每当您对资产进行更改(或对其进行监视)时重新生成资产的代价。

于 2014-10-07T02:53:49.117 回答
-2

在 app_dev 中,所有的缓存和自动加载都是从头开始的,而我发现在 dev 中最慢的是 orm。因为它,我回避使用 orm 并主要关注 dbal,尽管我可能不应该这样做。Orm 在 sf2 中用的比较多。我的猜测是 orm 是让你在开发中最慢的东西。查看您的开发配置和产品配置之间的区别。但是,对您的开发配置进行一些调整可以使开发更加快速和愉快。只要尝试并注意您在做什么。例如,关闭 twig 控制器然后修改大量模板会有点令人沮丧。您需要不断清除缓存。但就像你提到的,它只是开发者,当它上线的时候,symfony 会为你加速。

于 2012-10-16T02:02:28.587 回答