题
什么是最简单的方法,以简表a PHP script?
我喜欢跟踪上的东西,显示了我一个倾倒的所有多功能的电话和他们多长时间了但我还没把东西周围的特定功能。
我尝试尝试 microtime 功能:
$then = microtime();
myFunc();
$now = microtime();
echo sprintf("Elapsed: %f", $now-$then);
但是,这有时给我的消极结果。加上这是一个很大的麻烦洒,在我的代码。
解决方案
的 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年扩展 不再是保持 并且具有各种兼容性问题(见注释)。
其他提示
你想要的 xdebug 我认为。安装服务器上打开它,泵的输出的通过 某些回答呈 (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
近DB
0.000049
做
跨张贴我的参照从这样的文件测试,这是会离线。
分析与XDebug
一个扩展到PHP称为Xdebug提供协助 分析应用程序, 以及运行调试。时运行的分析器,其输出是书面文件的二元格式称为"cachegrind".应用程序都可以在每个平台,以分析这些文件。 没有应用程序的代码的更改是必要的,以执行这一分析。
为使分析,安装的扩展和调整php.ini settings.一些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"
下一次使用一个网客户的要求应用程序的网址,你想简介,例如
http://example.com/article/1?XDEBUG_PROFILE=1
作为该网页进程,它将编写一个文件与名称相似
/tmp/cachegrind.out.12345
通过默认数量在该文件的过程是id写的。这是与配置 xdebug.profiler_output_name
设置。
注意,它将编写一个文件针对每个PHP请求/程序,执行。因此,举例来说,如果你想要分析的一种形式后,一个配置文件将编写得到的请求显示HTML形式。该XDEBUG_PROFILE参数,将需要通过进入随后的后期请求分析第二个要求它处理的形式。因此,在分析时它有时也更容易运行curl后一种形式。
分析输出
一旦写入档缓可读通过应用程序(如 某些回答呈 或 Webgrind.PHPStorm,一个受欢迎的PHP IDE,也可以 显示这一分析数据.
某些回答呈,例如,将显示的信息,包括:
- 功能的执行
- 呼叫的时间,两个本身和包容性的后续函电话
- 次数的每个功能是所谓
- 呼叫图
- 链接,以源代码
要找什么
很明显的性能调是非常具体到每个应用程序的使用情况。一般这是很好的看起来:
- 反复呼吁以同样的功能你不希望看到的。对于功能的处理和查询这些数据可以总理的机会应用缓存。
- 运行速度缓慢的功能。哪里是应用程序支出的大部分时间?最好的回报在性能调整的重点是那些部分应用程序,其消耗最多的时间。
注意到:Xdebug,特别是它的分析功能,是非常耗费资源和减缓PHP执行。它建议对不执行这些在一个生产服务器环境。
如果减去microtimes给你的负面结果,尝试使用的功能与参数 true
(microtime(true)
).与 true
, ,该功能将返回浮动,而不是一串(因为它如果它被称为没有参数).
老实说,我将认为,使用NewRelic为的分析是最好的。
这是一个PHP扩展这似乎并没有缓慢的下运行时在所有和他们监视你,使体面的深入。在昂贵的版本,他们能让重型钻下(但是我们不能承受它们的定价模型)。
不过,即使用免费/标准的计划,这是显而易见的和简单的最低挂果。我也一样,它可以给你一个想法关数据库相互作用。
PECL XHPROF 看起来interensting。它已 可点击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
]
]
我喜欢用phpDebug用于分析。http://phpdebug.sourceforge.net/www/index.html
它输出的所有时间/存储器的使用对于任何SQL使用,以及所有包括文件。显然,它的工作原理上最好的代码就是抽象的.
为功能和流的分析,我将只使用 microtime()
+ get_memory_usage()
+ get_peak_memory_usage()
.
对于制定基准,就像在你的例子,我用的 梨基准 包。你设置的标记用于测量。班也提供了一些介绍佣工,或者你可以处理的数据正如你看到的配合。
我实际上拥有这包裹在另一个类__毁方法。当一个脚本退出,输出是记录通过log4php到syslog,所以我有一个很大的成绩数据,从工作。