为什么构建Symfony响应需要这么长时间,使用如此多的内存,我该怎么办呢?

mpe*_*pen 4 php performance symfony symfony-http-foundation

测试脚本:

#!/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";
Run Code Online (Sandbox Code Playgroud)

输出:

2.25 ms
256.0 KiB
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我把它放在一个循环中,成本不会增加太多:

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

6.73 ms
512.0 KiB
Run Code Online (Sandbox Code Playgroud)

但我只需要一个回复,所以这并不特别重要.

纵观构造Response,它几乎没有做任何事情.它只是初始化了一些变量.

2ms是我响应时间的重要部分,如果可能的话,我真的很想降低它.

Igo*_*vić 5

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

它会通过显示每种方法花费了多少时间以及调用它的次数来告诉您"问题"的确切位置.

在这种情况下,"问题"是第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";
Run Code Online (Sandbox Code Playgroud)

在我的机器上使用206线进行测试

3.57 ms
0.0 KiB
Run Code Online (Sandbox Code Playgroud)

使用206线进行测试,在我的机器上注释掉了

0.32 ms
0.0 KiB
Run Code Online (Sandbox Code Playgroud)