【问题标题】:Why does constructing a Symfony Response take so long, use so much memory, and what can I do about it?为什么构建一个 Symfony 响应需要这么长时间,占用这么多内存,我能做些什么呢?
【发布时间】:2014-11-26 19:46:55
【问题描述】:

测试脚本:

#!/usr/bin/php
<?php
require __DIR__.'/../www/autoload.php';

$start = microtime(true);
$mem = memory_get_usage(true);
$resp = new \Symfony\Component\HttpFoundation\Response();
$elapsed = (microtime(true)-$start)*1000;
$used_mem = memory_get_usage(true)-$mem;
echo number_format($elapsed,2)." ms\n";
echo number_format($used_mem/1024,1)." KiB\n";

输出:

2.25 ms
256.0 KiB

有趣的是,如果我把它放在一个循环中,成本并没有增加多少:

$resp = [];
for($i=0; $i<100; ++$i) {
    $resp[] = new \Symfony\Component\HttpFoundation\Response();
}

6.73 ms
512.0 KiB

但我只需要一个响应,所以这并不特别重要。

查看the constructorResponse,它几乎没有任何作用。它只是初始化了一些变量。

2ms 是我响应时间的重要组成部分,如果可能的话,我真的很想把它缩短。

【问题讨论】:

  • 这不是Response类定义的自动加载吗?
  • @TomaszMadeyski 没有考虑自动加载。那肯定是一个因素。我使用的自动加载器甚至不是作曲家。情况更糟。

标签: php performance symfony symfony-http-foundation


【解决方案1】:

当您遇到此类问题时,您通常应该使用 XDebug 进行分析:http://www.xdebug.org/docs/profiler

它会告诉你每个方法花费了多少时间以及调用了多少次,从而准确地告诉你“问题”在哪里。

在这种情况下,“问题”是Line 206,\DateTime 对象的构造,然后是\DateTimeZone 对象。

要消除所有其他因素,请确保首先不发生自动加载,因此将您的测试修改为:

<?php

require 'vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Response.php';
require 'vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/HeaderBag.php';
require 'vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/ResponseHeaderBag.php';

$start = microtime(true);
$mem = memory_get_usage(true);
$resp = new \Symfony\Component\HttpFoundation\Response();
$elapsed = (microtime(true)-$start)*1000;
$used_mem = memory_get_usage(true)-$mem;
echo number_format($elapsed,2)." ms\n";
echo number_format($used_mem/1024,1)." KiB\n";

在我的机器上用第 206 行测试

3.57 ms
0.0 KiB

在我的机器上注释掉第 206 行的测试

0.32 ms
0.0 KiB

【讨论】:

  • 没想到会成为瓶颈!这很容易解决。万分感谢!下次记得用xdebug。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
  • 2020-02-15
  • 2011-08-27
  • 2011-12-07
  • 2012-08-09
相关资源
最近更新 更多