本文转自:http://blog.csdn.net/liangjianquan10/article/details/41447581,加上自己的一点修改以完善流程
XHProf是facebook开发的一个PHP扩展,用于采集php程序中每个函数的性能开销。采集的数据包括:内存消耗、CPU计算时间、函数执行时长等等。
XHProf同时提供了一套查看性能数据的web界面,可查看php程序执行过程中函数的调用情况和性能开销,也可对多个结果进行差异对比或者汇总。
1. 安装XHProf扩展
XHProf的安装步骤和常规php扩展的安装一样:
(1). 下载XHProf,目前最近版为xhprof-0.9.4.tgz(http://pecl.php.net/package/xhprof)
(2). 解压
tar -zxvf xhprof-0.9.4.tgz
(3). 进入xhprof-0.9.4/extension执行phpize
cd xhprof-0.9.4/extension
/usr/local/php/bin/phpize
(4). 执行configure,指定php-config路径
./configure --with-php-config=/usr/local/php/bin/php-config
(5). 执行make & make install
make install
(6). 修改php.ini,引入xhprof.so并指定XHProf的性能数据存放目录
extension=xhprof.so;
xhprof.output_dir=/usr/local/avery/xhprof_data;
2. 安装Graphviz
Graphviz是一个基于命令行的绘图工具,XHProf中使用Graphviz的命令来绘制函数调用图。
Graphviz的安装过程和其他Linux软件安装无异,同样是configure、make、make install三步骤,这里不再赘述。需要注意的是,安装成功后需要将graphviz/bin/dot命令的路径加入到环境变量,因为xhprof生成函数调用图时会直接执行dot命令来生成图片。
至此,XHProf扩展已经安装好了,我们可以通过XHProf提供的函数进行性能数据采集。但采集完成后,我们需要将数据存储并通过可视化界面展示出来,XHProf提供了相关的类库和web页面,分别位于xhprof-0.9.4/xhprof_lib和xhprof-0.9.4/xhprof_html,我们需要将这两个目录引入项目。
如果PHP7安装失败可按照如下解决方法:
git clone git@github.com:Yaoguais/phpng-xhprof.git ./xhprof
cd xhprof
/path/to/php7/bin/phpize
./configure --with-php-config=/path/to/php7/bin/php-config
make clean && make && make test && sudo make install
三、相关函数
详见http://www.php.net/manual/zh/ref.xhprof.php
四、名词解释
1. xhprof_disable返回的数组中:
ct 表示 调用的次数
wt 表示 函数方法执行的时间耗时。相当于,在调用前记录一个时间,函数方法调用完毕后,计算时间差,单位微秒。
cpu 表示 函数方法执行消耗的cpu时间。和wt的差别在于,当进程让出cpu使用权后,将不再计算cpu时间。通过调用系统调用getrusage获取进程的占用cpu数据,单位微秒。
mu 表示 函数方法所使用的内存。相当于,在调用前记录一个内存占用,函数方法调用完毕后,计算内存差。调用的是zend_memory_usage获取内存占用情况,单位字节。
pmu 表示 函数方法所使用的内存峰值。调用的是zend_memory_peak_usage获取内存情况,单位字节。
输出内容中good==>good@1 是什么意思
==>表示一个调用关系。由于带@,说明是一个递归调用。@后面的数字是递归调用的深度。
如何设置xhprof_enable的参数,减少性能消耗
xhprof_enable提供了三个常量,用于设置你是否需要统计PHP内置函数,都统计那些指标。
三个常量如下:
XHPROF_FLAGS_NO_BUILTINS
设置这个常量后,将不统计PHP内置函数。毕竟PHP的内置函数性能一般都不错。没必要再消耗性能去统计。所以,建议设置。
XHPROF_FLAGS_CPU
设置这个常量后,会统计进程占用CPU时间。由于CPU时间是通过调用系统调用getrusage获取,导致性能比较差。开启这个选项后,大概性能下降一半。因此,如果对cpu耗时不是特别敏感的情况下,建议不要启用这个选项。
XHPROF_FLAGS_MEMORY
设置这个常量后,将会统计内存占用情况。由于获取内存情况,使用的是zend_memory_usage和zend_memory_peak_usage,并不是系统调用。因此,对性能影响不大。如果需要对内存使用情况进行分析的情况下,可以开启。
PS:在我虚拟机PHP7环境中开启XHPROF_FLAGS_CPU和XHPROF_FLAGS_MEMORY会报错。
2. 数据查看页面中:
Calls:函数调用次数
Incl. Wall Time:包括子函数的函数执行时间。
Excl. Wall Time:不包括子函数的函数执行时间。
Incl. CPU:包括子函数的cpu计算时间。
Excl. CPU:不包括子函数的cpu计算时间。
Incl.MemUse:包括子函数的内存使用量。
Excl.MemUse:不包括子函数的内存使用量。
Incl.PeakMemUse:包括子函数的内存使用峰值。
Excl.PeakMemUse:不包括子函数的内存使用峰值。
五、常见问题
多次调用xhprof_enable方法,最后生效的配置是哪个?
当你在一次请求中多次调用xhprof_enable方法,只有第一次调用时进行的设置能生效。在调用xhprof_disable()后,你又可以使用xhprof_enable方法进行设置。
引用:
http://blog.csdn.net/liangjianquan10/article/details/41447581http://www.imooc.com/article/12329