XHProf是facebook 开发的一个测试php性能的扩展,本文记录了在PHP应用中使用XHProf对PHP进行性能优化,查找性能瓶颈的方法。php
$ wget http://pecl.php.net/get/xhprof-0.9.4.tgz
$ tar -zxvf xhprof-0.9.4.tgz
$ cd xhprof-0.9.4 $ cd extension/ $ phpize $ ./configure $ make $ sudo make install
修改php.ini
html
[xhprof] extension=xhprof.so xhprof.output_dir=/tmp
配置中
xhprof.output_dir
指定了生成的profile文件存储的位置,咱们将其指定为/tmp。nginx
在XHProf扩展中,一共提供了四个函数用于对PHP进行性能分析。web
xhprof_enable/xhprof_sample_enable
函数用于开始XHProf性能分析,区别在于前者功能更增强大,然后者则是是以简单模式启动性能分析(简单记录了函数的调用栈信息),开销比较小。segmentfault
xhprof_disable/xhprof_sample_disable
函数用于中止性能分析,并返回分析的数据。数组
须要特别说明的函数是xhprof_enable
,其余函数都是不须要提供参数的,而该函数则能够接受两个可选的参数,用于改变该工具的行为。性能优化
void xhprof_enable ([ int $flags = 0 [, array $options ]] )
flags 该参数用于为剖析结果添加额外的信息,该参数的值使用如下宏,若是须要提供多个值,使用|
进行分隔。bash
XHPROFFLAGSNO_BUILTINS 跳过全部的内置函数服务器
XHPROFFLAGSCPU 添加对CPU使用的分析markdown
XHPROFFLAGSMEMORY 添加对内存使用的分析
options 数组形式提供可选参数,在此处提供ignored_functions
选项须要忽略的函数
好比下面的例子,同时对内存和CPU进行分析,而且忽略对call_user_func
和call_user_func_array
函数的分析。
xhprof_enable(
XHPROF_FLAGS_MEMORY|XHPROF_FLAGS_CPU,
[
'ignored_functions' => [ 'call_user_func', 'call_user_func_array' ] ] ); // 这里是PHP代码,好比业务逻辑实现等要被分析的代码部分 .... $xhprofData = xhprof_disable();// $xhprofData是数组形式的分析结果 print_r($xhprofData);
注意,若是使用
XHPROF_FLAGS_CPU
选项对CPU占用也进行分析,在Linux环境下,会形成比较高的系统负载,所以不建议使用,而推荐只使用XHPROF_FLAGS_MEMORY
,对内存的分析不会对系统形成太多负载。
使用xhprof_disable
完成性能分析而且获取到分析结果以后,咱们一般不会直接输出结果,由于这样的结果是以数组形式组织的,看起来并不直观,幸运的是,xhprof提供了基于web的图形界面对分析结果进行查看。
在使用以前,请先确保服务器安装了graphviz
工具,不然在生成监控图表的时候回出现如下错误:
failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '
这里提示找不到dot
命令,因此须要先安装graphviz
$ sudo yum install graphviz
因为分析结果的查看工具是基于web的,所以,咱们须要将xhprof安装包中的xhprofhtml和xhproflib目录放到服务器的web目录下,让xhprof_html目录中的内容对外能够访问。
好比个人测试服务器环境是使用vagrant搭建的Cent OS,我见过这两个目录放到/vagrant/xhprof目录下:
[vagrant@localhost xhprof]$ pwd /vagrant/xhprof [vagrant@localhost xhprof]$ ls xhprof_html xhprof_lib
web服务器使用的是Nginx,所以,在Nginx的配置文件nginx.conf
中的配置以下:
server { listen 80; server_name _; root /vagrant; ...
web服务器的根目录是/vagrant,所以访问地址为http://localhost/xhprof/xhprof_html/index.php
.
固然,配置好环境以后,咱们仍是获取不到分析结果的,由于咱们在代码中并无将分析结果保存到xhprof.output_dir
指定的目录中。
所以,咱们须要修改咱们的代码,是其可以将分析结果存放到xhprof.output_dir
指定的目录中。
....
$xhprofData = xhprof_disable();
require '/vagrant/xhprof/xhprof_lib/utils/xhprof_lib.php'; require '/vagrant/xhprof/xhprof_lib/utils/xhprof_runs.php'; $xhprofRuns = new XHProfRuns_Default(); $runId = $xhprofRuns->save_run($xhprofData, 'xhprof_test'); echo 'http://localhost/xhprof/xhprof_html/index.php?run=' . $runId . '&source=xhprof_test';
变量$runId
是本次请求生成分析结果的id,最后咱们输出了一个连接地址,使用改地址就能够看到本次请求的分析结果。
注意到中间的View Full Callgraph
连接,经过该连接咱们能够看到图形化的分析结果。
图中红色的部分为性能比较低,耗时比较长的部分,咱们能够根据根据哪些函数被标记为红色对系统的代码进行优化