参考文章:http://www.chenglin.name/php/optimization/439.html
http://pecl.php.net/get/xhprof-0.9.4.tgz
官网下载:http://pecl.php.net/package/xhprof
cd xhprof-0.9.4/extension/
/apps/svr/php/bin/phpize
./configure --enable-xhprof --with-php-config=/apps/svr/php/bin/php-config
make && make install
vim /apps/svr/php/etc/php.ini (找下自己的位置php.ini)
[xhprof]extension=xhprof.so;下面的这个地址是用来保存测量记录的目录,
在页面输出测量得到的数据的时候,它会自动到这儿来找输出的文件。xhprof.output_dir="/tmp/xhprof/"
3、拷贝文件
把xhprof-0.9.4目录下的目录xhprof_html 和 xhprof_lib 下的所有文件拷贝到你网站的主目录下,假设网站主目录:/opt/wwwroot/
重启php-fpm
<?php //phpinfo();exit('ffffff'); function bar($x) { if ($x > 0) { bar($x - 1); }}function foo() { for ($idx = 0; $idx < 5; $idx++) { bar($idx); $x = strlen("abc"); }}//开启调试xhprof_enable();// cpu:XHPROF_FLAGS_CPU 内存:XHPROF_FLAGS_MEMORY// 如果两个一起:XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY //xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);//要测试的php代码foo();//停止监测$xhprof_data = xhprof_disable();// display raw xhprof data for the profiler run//print_r($xhprof_data);//包含工具类,在下载的 tgz 包中可以找到$XHPROF_ROOT = realpath(dirname(__FILE__) );// echo $XHPROF_ROOT;exit;include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";//echo $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";exit('ffffff');// save raw data for this profiler run using default// implementation of iXHProfRuns. $xhprof_runs = new XHProfRuns_Default();//print_r($xhprof_runs);exit('fffff');// xhprof_foo 指命名空间,可以为任意字符串$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");echo "---------------\n". "Assuming you have set up the http based UI for \n". "XHProf at some address, you can view run at \n". "http://<xhprof-ui-address>/index.php?run=$run_id&source=xhprof_foo\n". "---------------\n";访问路径:http://sample.zintao.com/xhprof_html/index.php?run=56d3a9dbddfa0&source=xhprof_foo
简述:XHProf是一个分层PHP性能分析工具。它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况。一个函数的开 销,可细分成调用者和被调用者的开销,XHProf数据收集阶段,它记录调用次数的追踪和包容性的指标弧在动态callgraph的一个程序。它独有的数 据计算的报告/后处理阶段。在数据收集时,XHProfd通过检测循环来处理递归的函数调用,并通过给递归调用中每个深度的调用一个有用的命名来避开死循 环。XHProf分析报告有助于理解被执行的代码的结构,它有一个简单的HTML的用户界面( PHP写成的)。基于浏览器的性能分析用户界面能更容易查看,或是与同行们分享成果。也能绘制调用关系图。
#2.安装Graphviz
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.28.0.tar.gz
这个能下载:http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
目前最新:http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.34.0.tar.gz
tar zxf graphviz-2.28.0.tar.gz
cd graphviz-2.28.0
./configure --prefix=/elain/apps/graphviz
make && make install
点击
thinkphp 使用例子
把xhprof_lib目录下的utils/xhprof_lib.php内容全部添加到你的项目的common.php文件里
把utils/xhprof_runs.php文件copy到你的项目文件的Lib/ORG/下。(如果没有这个ORG目录,自己mkdir一下)
我的测试,直接放在ThinkPHP\Library\Org\Util import("ORG.Util.XhprofRuns"); //引用。。与例子不一样
//开启调试xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
写代码调用model
//停止监测$xhprof_data = xhprof_disable();import("ORG.Util.XhprofRuns"); //引用。。与例子不一样$xhprof_runs = new \XHProfRuns_Default();// xhprof_foo 指命名空间,可以为任意字符串$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");echo "---------------\n"."Assuming you have set up the http based UI for \n"."XHProf at some address, you can view run at \n"."http://<xhprof-ui-address>/index.php?run=$run_id&source=xhprof_foo\n"."---------------\n";exit;
输出结果的含义:
ct 函数调用次数,
wt 花费的时间,
cpu 花费的 CPU 时间(微秒即百万分之一秒),
mu 使用的内存(bytes),
pmu 使用的内存峰值(bytes)。
web 分析结果页面含义
Calls:函数的调用次数 Incl. Wall Time (microsec) :包含内部函数花费的时间,单位微秒 Excl. Wall Time (microsec):不包含内部函数花费的时间,单位微秒 及所占百分比(%) 注:Incl.:为 Including 包含的简写 Excl.:为 Excluding 不包含的简写 Wall Time:意为挂钟时间即任务花费的时间
main():一个虚构的函数,程序根节点
bar@2:递归调用 2 次
Incl. CPU (microsecs):包含内部函数 CPU 花费的时间,单位微秒 Excl. CPU (microsec):不包含内部函数 CPU 花费的时间,单位微秒 Incl. MemUse (bytes):包含内部函数所占内存,单位字节 Excl. MemUse (bytes):不包含内部函数所占内存,单位字节 Incl. PeakMemUse (bytes):包含内部函数所占内存峰值,单位字节 Excl. PeakMemUse (bytes):不包含内部函数所占内存峰值,单位字节 及所占百分比(%) 可以认为共三种情况: 1. 包括内部函数 2. 不包括内部函数或者说函数本身 3. 所占总数(时间或内存使用)的百分比