分析PHP脚本最简单的方法是什么?

我喜欢在上面添加一些东西,告诉我所有函数调用的转储以及它们花了多长时间,但我也可以在特定的函数周围放一些东西。

我尝试了微时间功能:

$then = microtime();
myFunc();
$now = microtime();

echo sprintf("Elapsed:  %f", $now-$then);

但这有时会给我带来负面结果。另外,在我的代码中散布这些代码会带来很多麻烦。


当前回答

对于基准测试,就像在您的示例中一样,我使用pear Benchmark包。你设置标记来测量。该类还提供了一些表示帮助程序,或者您可以根据自己的需要处理数据。

我实际上用__destruct方法将它包装在另一个类中。当脚本退出时,输出将通过log4php记录到syslog,因此我有很多性能数据可以使用。

其他回答

PECL XHPROF看起来也很有趣。它有可点击的HTML界面,用于查看报告和相当简单的文档。不过我还没有测试过。

可怜人的侧写,不需要扩展。支持嵌套配置文件和总百分比:

function p_open($flag) {
    global $p_times;
    if (null === $p_times)
        $p_times = [];
    if (! array_key_exists($flag, $p_times))
        $p_times[$flag] = [ 'total' => 0, 'open' => 0 ];
    $p_times[$flag]['open'] = microtime(true);
}

function p_close($flag)
{
    global $p_times;
    if (isset($p_times[$flag]['open'])) {
        $p_times[$flag]['total'] += (microtime(true) - $p_times[$flag]['open']);
        unset($p_times[$flag]['open']);
    }
}

function p_dump()
{
    global $p_times;
    $dump = [];
    $sum  = 0;
    foreach ($p_times as $flag => $info) {
        $dump[$flag]['elapsed'] = $info['total'];
        $sum += $info['total'];
    }
    foreach ($dump as $flag => $info) {
        $dump[$flag]['percent'] = $dump[$flag]['elapsed']/$sum;
    }
    return $dump;
}

例子:

<?php

p_open('foo');
sleep(1);
p_open('bar');
sleep(2);
p_open('baz');
sleep(3);
p_close('baz');
sleep(2);
p_close('bar');
sleep(1);
p_close('foo');

var_dump(p_dump());

收益率:

array:3 [
  "foo" => array:2 [
    "elapsed" => 9.000766992569
    "percent" => 0.4736904954747
  ]
  "bar" => array:2 [
    "elapsed" => 7.0004580020905
    "percent" => 0.36841864946596
  ]
  "baz" => array:2 [
    "elapsed" => 3.0001420974731
    "percent" => 0.15789085505934
  ]
]

XDebug并不稳定,而且并不总是适用于特定的php版本。例如,在一些服务器上,我仍然运行php-5.1.6,这是RedHat RHEL5附带的(顺便说一下,所有重要问题仍然会收到更新),而且最近的XDebug甚至不使用这个php编译。所以我最终切换到DBG调试器 它的php基准测试为函数、方法、模块甚至行提供了计时。

我认为你需要xdebug。在服务器上安装它,打开它,通过kcachegrind (linux)或wincachegrind (windows)输出,它会向你展示一些漂亮的图表,详细说明确切的时间,计数和内存使用(但你需要另一个扩展)。

这真的很震撼:D

PECL APD扩展的用途如下:

<?php
apd_set_pprof_trace();

//rest of the script
?>

之后,使用pprofp解析生成的文件。

示例输出:

Trace for /home/dan/testapd.php
Total Elapsed Time = 0.00
Total System Time  = 0.00
Total User Time    = 0.00


Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
100.0 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0000   0.0009            0 main
56.9 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0005   0.0005            0 apd_set_pprof_trace
28.0 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 preg_replace
14.3 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 str_replace

警告:APD的最新发布日期是2004年,扩展不再维护,并有各种兼容性问题(见评论)。