引言: 

XHProf是一个分层PHP性能分析工具。它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情 况。一个函数的开销,可细分成调用者和被调用者的开销。原始数据收集部分是用纯C实现的,是一个名叫xhprof的 Zend扩展 。XHProf有一个简单的HTML的用户界面( PHP写成的)。基于浏览器的性能分析用户界面能更容易查看,或是与同行们分享成果。也能绘制调用关系图。

XHProf报告往往可以有助于理解被执行的代码的结构。的等级性质的报告可用来确定,例如,什么链要求导致了所谓的特殊 功能得到。

XHProf可以比较两次运行的结果(又名“差异报告”)或是从多次运行得到的汇总数据。差异和汇总报告,就像单一运行报 告一样,也提供“平板”以及“分层”的性能分析视图。

XHProf是一种轻量级的性能分析工具。在数据收集阶段,它记录调用次数的追踪和包容性的指标弧在动态 callgraph的一个程序。它独有的数据计算的报告/后处理阶段。在数据收集时,XHProfd通过检测循环来处理递归的函数调用,并通过给递归调用 中每个深度的调用一个有用的命名来避开死循环。

XHProf的轻量级性质和汇聚功能,使得它非常适合用于收集“生产环境”的性能统计数据的统计。

安装:

wget http://pecl.php.net/get/xhprof-0.9.2.tgz

tar zxf xhprof-0.9.2.tgz

cd xhprof-0.9.2

cp -r xhprof_html xhprof_lib <directory_for_htdocs>

cd extension

phpize

./configure

make

make install

 

编辑php.ini

 

[xhprof]

extension=xhprof.so

;

; directory used by default implementation of the iXHProfRuns

; interface (namely, the XHProfRuns_Default class) for storing

; XHProf runs.

;

xhprof.output_dir=<directory_for_storing_xhprof_runs>

 

 

 

 

重启服务让修改生效,现在就可以使用XHProf了,不过为了显示效果更炫、更直观,最好继续安装Graphviz

 

安装Graphviz

 

wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz

tar zxf graphviz-2.24.0.tar.gz

cd graphviz-2.24.0

./configure

make

make install

 

xhprof 使用说明:

在代码中,程序头部如下设置:

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

 

 

程序最下面:

$xhprof_data = xhprof_disable();

include_once "./xhprof_lib/utils/xhprof_lib.php";

include_once "./xhprof_lib/utils/xhprof_runs.php";

$xhprof_runs = new XHProfRuns_Default();

$run_id = $xhprof_runs->save_run($xhprof_data, 'xhprof');

echo 'http://<xhprof-ui-address >/index.php?run='.$run_id.'&source=xhprof';//source的值就是save_run的第二个参数的值。其中,网址就是上面保存xhprof_html的路径。

经过上面设置,之后执行刚才的php页面,xhprof.output_dir指定的目录便有文件生成,类似于4e813c15a46ff.xhprof

通过浏览器访问:

http://<xhprof-ui-address >/index.php?run=4e813c15a46ff&source=xhprof    

 

但是如果查看[View Full Callgraph]的时候,却提示如下:Error: either we can not find profile data for run_id 4d7f0bd99a12f or the threshold 0.01 is too small or you do not have ‘dot’ p_w_picpath generation utility installed.

 

解释如下:

xhprof绘制的是png图,系统(graphviz-2.24.0)不支持。绘图的dot拓展没装成功,也就是dot 不支持PNG。赶紧再次编译下graphviz,看看提示信息有什么缺少的

graphviz目录下,执行  ./configure

可以看到png:           No (missing png.h)

 

解决办法:

 

libpng官网down分源码,再次编译一下

网址 http://sourceforge.net/projects/libpng/files/libpng15/1.5.1/  选择合适源码包

 

wget http://nchc.dl.sourceforge.net/project/libpng/libpng15/1.5.1/libpng-1.5.1.tar.gz

tar zxf libpng-1.5.1.tar.gz

cd libpng-1.5.1

./configure

make

make install

然后重新编译安装graphviz  ,解决问题

当现在打开[View Full Callgraph]的时候,直观的资源占用统计图就出现在眼前了

 

结果分析:

 主要的

Inclusive Time (或子树时间):包括子函数所有执行时间。

Exclusive Time/Self Time:函数执行本身花费的时间,不包括子树执行时间。

Wall时间:花去了的时间或挂钟时间。

CPU时间:用户耗的时间+内核耗的时间

表单中的

Function Name 函数名

Calls 调用次数

Calls% 调用百分比

Incl. Wall Time (microsec) 调用的包括子函数所有花费时间 以微秒算(一百万分之一秒)

IWall% 调用的包括子函数所有花费时间的百分比

Excl. Wall Time (microsec) 函数执行本身花费的时间,不包括子树执行时间,以微秒算(一百万分之一秒)

EWall% 函数执行本身花费的时间的百分比,不包括子树执行时间

Incl. CPU(microsecs) 调用的包括子函数所有花费的cpu时间。减Incl. Wall Time即为等待cpu的时间

减Excl. Wall Time即为等待cpu的时间

ICpu% Incl. CPU(microsecs)的百分比

Excl. CPU(microsec) 函数执行本身花费的cpu时间,不包括子树执行时间,以微秒算(一百万分之一秒)。

ECPU% Excl. CPU(microsec)的百分比

Incl.MemUse(bytes) 包括子函数执行使用的内存。

IMemUse% Incl.MemUse(bytes)的百分比

Excl.MemUse(bytes) 函数执行本身内存,以字节算

EMemUse% Excl.MemUse(bytes)的百分比

Incl.PeakMemUse(bytes) Incl.MemUse的峰值

IPeakMemUse% Incl.PeakMemUse(bytes) 的峰值百分比

Excl.PeakMemUse(bytes) Excl.MemUse的峰值

EPeakMemUse% EMemUse% 峰值百分比