剖析PHP脚本的最简单方法是什么?
我喜欢在上面显示一些内容,这些内容可以显示所有函数调用的转储以及它们花了多长时间,但我也可以在特定函数周围添加一些内容。
我尝试使用microtime函数进行实验:
$then = microtime();
myFunc();
$now = microtime();
echo sprintf("Elapsed: %f", $now-$then);
但这有时给我负面的结果。另外,在我的代码中撒满代码也很麻烦。
剖析PHP脚本的最简单方法是什么?
我喜欢在上面显示一些内容,这些内容可以显示所有函数调用的转储以及它们花了多长时间,但我也可以在特定函数周围添加一些内容。
我尝试使用microtime函数进行实验:
$then = microtime();
myFunc();
$now = microtime();
echo sprintf("Elapsed: %f", $now-$then);
但这有时给我负面的结果。另外,在我的代码中撒满代码也很麻烦。
Answers:
所述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年,该扩展不再维护,并且存在各种兼容性问题(请参阅注释)。
pecl install apd
PHP7。当尝试使用进行PHP 5的安装时,它会显示一条错误消息“ config.m4”。看来您必须从源代码安装它,但我还没有尝试过。认真地讲,是否没有一种现代的,更新的基于CLI的PHP概要分析工具,该工具随Homebrew一起安装,需要最少的设置并提供易于理解的输出?
我想你想要xdebug。将其安装在服务器上,打开电源,通过kcachegrind(对于linux)或wincachegrind(对于Windows)泵送输出,它将为您显示一些漂亮的图表,详细说明了确切的时间,计数和内存使用情况(但您会为此需要另一个扩展)。
它摇晃,严重:D
无需扩展,只需使用这两个函数即可进行简单的性能分析。
// Call this at each point of interest, passing a descriptive string
function prof_flag($str)
{
global $prof_timing, $prof_names;
$prof_timing[] = microtime(true);
$prof_names[] = $str;
}
// Call this when you're done and want to see the results
function prof_print()
{
global $prof_timing, $prof_names;
$size = count($prof_timing);
for($i=0;$i<$size - 1; $i++)
{
echo "<b>{$prof_names[$i]}</b><br>";
echo sprintf(" %f<br>", $prof_timing[$i+1]-$prof_timing[$i]);
}
echo "<b>{$prof_names[$size-1]}</b><br>";
}
这是一个示例,在每个检查点调用带有说明的prof_flag(),并在末尾调用prof_print():
prof_flag("Start");
include '../lib/database.php';
include '../lib/helper_func.php';
prof_flag("Connect to DB");
connect_to_db();
prof_flag("Perform query");
// Get all the data
$select_query = "SELECT * FROM data_table";
$result = mysql_query($select_query);
prof_flag("Retrieve data");
$rows = array();
$found_data=false;
while($r = mysql_fetch_assoc($result))
{
$found_data=true;
$rows[] = $r;
}
prof_flag("Close DB");
mysql_close(); //close database connection
prof_flag("Done");
prof_print();
输出看起来像这样:
开始
0.004303
连接到数据库
0.003518
执行查询
0.000308
检索数据
0.000009
关闭数据库
0.000049
完成
从离线发布的SO Documentation beta交叉发布我的参考。
PHP的扩展名Xdebug可用于帮助分析PHP应用程序以及运行时调试。运行探查器时,输出以称为“ cachegrind”的二进制格式写入文件。每个平台上都可以使用应用程序来分析这些文件。 无需更改应用程序代码即可执行此概要分析。
要启用分析,请安装扩展并调整php.ini设置。一些Linux发行版附带标准软件包(例如Ubuntu的php-xdebug
软件包)。在我们的示例中,我们将根据请求参数可选地运行配置文件。这使我们可以保持设置为静态,并仅在需要时打开探查器。
# php.ini settings
# Set to 1 to turn it on for every request
xdebug.profiler_enable = 0
# Let's use a GET/POST parameter to turn on the profiler
xdebug.profiler_enable_trigger = 1
# The GET/POST value we will pass; empty for any value
xdebug.profiler_enable_trigger_value = ""
# Output cachegrind files to /tmp so our system cleans them up later
xdebug.profiler_output_dir = "/tmp"
xdebug.profiler_output_name = "cachegrind.out.%p"
接下来,使用Web客户端向您要配置的应用程序URL发出请求,例如
http://example.com/article/1?XDEBUG_PROFILE=1
在页面处理过程中,它将以与以下名称相似的名称写入文件
/tmp/cachegrind.out.12345
默认情况下,文件名中的数字是编写它的进程ID。这可以通过xdebug.profiler_output_name
设置进行配置。
请注意,它将为每个执行的PHP请求/进程写入一个文件。因此,例如,如果您希望分析表单帖子,则将为GET请求编写一个配置文件以显示HTML表单。XDEBUG_PROFILE参数将需要传递到后续的POST请求中,以分析处理表单的第二个请求。因此,进行概要分析时,有时更容易运行curl直接将表单过帐。
分析输出
写入配置文件缓存后,可以由KCachegrind或Webgrind之类的应用程序读取。流行的PHP IDE PHPStorm也可以显示此概要分析数据。
例如,KCachegrind将显示以下信息:
要找什么
显然,性能调整是针对每个应用程序的用例的。总的来说,寻找:
注意:Xdebug,尤其是它的概要分析功能,占用大量资源,并降低了PHP执行速度。建议不要在生产服务器环境中运行它们。
老实说,我将争论使用NewRelic进行性能分析是最好的。
这是一个PHP扩展,似乎根本不会减慢运行时间,并且它们会为您进行监视,从而实现良好的向下钻取。在昂贵的版本中,它们允许大量下钻(但我们无法负担其定价模型)。
尽管如此,即使有了免费/标准计划,大多数悬而未决的地方也很明显而且很简单。我也喜欢它,它也可以为您提供有关数据库交互的想法。
可怜的人的轮廓,不需要扩展。支持嵌套的配置文件和总数的百分比:
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
]
]
PECL XHPROF看起来也很有趣。它具有可单击的HTML界面,用于查看报告和非常简单的文档。我还没有测试。
我喜欢使用phpDebug进行性能分析。 http://phpdebug.sourceforge.net/www/index.html
它输出所有使用的SQL以及所有包含的文件的所有时间/内存使用情况。显然,它最适合抽象的代码。
对于函数和类分析,我将仅使用microtime()
+ get_memory_usage()
+ get_peak_memory_usage()
。
我会挑衅地尝试BlackFire。
我已经使用puphpet集成了这个virtualBox ,以测试与BlackFire 一起使用的不同php框架,请根据需要随意进行分叉和/或分发:)
对于基准测试,就像您的示例一样,我使用pear Benchmark软件包。您设置用于测量的标记。该课程还提供了一些演示帮助器,或者您可以根据需要处理数据。
实际上,我使用__destruct方法将其包装在另一个类中。当脚本退出时,输出通过log4php记录到syslog,因此我有很多性能数据可以使用。
你们绝对应该检查这个新的PHP Profiler。
https://github.com/NoiseByNorthwest/php-spx
它重新定义了php分析器如何收集和呈现结果的方式。PHP-SPX不仅输出特定功能调用的总数以及执行它所花费的总时间,还以一种完全可读的方式呈现了请求执行的整个时间表。下面是它提供的GUI屏幕。