xhprof替代xdebug完成PHP代码性能监控

上一篇 / 下一篇  2012-04-26 18:18:51 / 个人分类:others

  其实,题目叫“xhprof替代xdebug完成PHP代码性能监控”还不是很准确,因为xhprof能够做的事情不仅仅是对性能数据的收集和分析,还包括了对函数的调用关系的收集等信息。言归正传,记录如下:
 1、xhprof到底能干啥?
  xhprof是Facebook放出的轻量级调试工具.和Xdebug相比xhprof更加易用和可控.尤其是生成流程图和调试数据对比的功能很好很强大。

2、如何安装xhprof
      因某些原因,我先在本地的windows上做试验,linux下的安装方法,网上有很多,反而windows下的比较少,windows安装方式方法如下(为了节省时间,转载网上的一个方法):
  • 由于参考了好几个博文,而且都是基于Linux版本的介绍,没有找到一个基于Windows的介绍,总不能一下子就切换到Linux下面去开发吧?所以又搜索,发现一个外文站点提供了一个编译好的Xhprof,不过版本是基于php-5.3.3-Win32版本的,代码是基于Xhprof的0.9.2版本的,呵呵,看来有人和我想到一块儿了,不过搜索的结果非常少,中文的几乎几乎没有,外文的也就只有凤毛麟角的几个结果而已。
  • 从该外文站点下载了xhprof for windows版本,又从facebook原始发布站下载了相关的xhprof代码和相关的生成页面文档,由于xhprof是基于php5.3.3编译的,还需要准备php5.3.3,直接去php.net去拉一个vc6线程安全版本下来。
  • Apache有现成的,所以直接修改了原来的http.conf,把php5.3.3以cgi方式引入apache中,调试了一下,顺利的集成,phpinfo一切正常,xdebug也是一切正常的,现在开始加入xhprof的准备工作都做好了。
  • 直接把xhprof for windows版本安置好,然后在要测试的页面里面加入调试页面和代码,就可以啦。

[步骤]

  • 然后要把xhprof的两个包含了调试输出页面的子目录安置好,这里我选择了直接安置在自己网站发布位置的根目录里,也就是apache默认的htdocs的目录里面,我这里的htdocs是转移到另外一个开发U盘上的,方便在不同的地方编制代码,如图2所示,这里图示了一共3个文件夹,分别是xhprof_html、xhprof_lib、xprof_log,其中xhprof_html和xhprof_lib是从下载的xhprof源代码文件包里得到的,包所在站点:http://pecl.php.net/package/xhprof,xhprof下载地址:http://pecl.php.net/get/xhprof-0.9.2.tgz,然后自行在htdocs里创建xprof_log文件夹,这个文件夹是用来存放页面分析数据的。
  • 由于我的Apache+php已经完全调试好,所以要处理的只有php.ini文件,开启办法很简单,在该文件的末尾加上如下代码即可:

[xhprof]
extension=php_xhprof.dll
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
xhprof.output_dir="M:/htdocs/xhprof_log"

“提示:xhprof.output_dir=这个使用于设置性能分析数据存放位置的,我这里应为htdocs在M盘,故设置为M:/htdocs/xhprof_log,也就是上述的目录位置”

  • 添加成功后,可以重启Apache看看phpinfo()信息中是否包含了xhprof的段,有的话,那就安装成功了,提示:以cgi方式运行的php修改了php.ini以后,可以直接运行phpinfo()查看结果,而无须重新启动Apache
  • 好了,至此为止,xhprof已经正确的安装好了。
    3、来个实例看看:
    被测试对象:
    <?php

function bar($x) {
  if ($x > 0) {
    bar($x - 1);
  }
}

function foo() {
  for ($idx = 0; $idx < 2; $idx++ ) {
    bar($idx);
    $x = strlen("abc");
  }
}

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); 

// run program
foo();


$xhprof_data = xhprof_disable();


print_r($xhprof_data);

其中:
a、开启xhprof对于代码使用的cpu,内存等profile信息的收集
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); 

b、停止xhprof的profile数据收集
$xhprof_data = xhprof_disable();

c、显示xhprof的profile性能数据
print_r($xhprof_data);
PS:xhprof还有很多其它的自身的一些使用方法和设定,随着后续的不断实践和总结在自己弄清楚,看到结果后再更新过来,更加有说服力:)

在浏览器中访问该PHP文件:(根据个人所放置的文件位置访问路径略有不同)
http://localhost/first/xhprof.php
最终看到的结果为:
Array ( [foo==>bar] => Array ( [ct] => 2 [wt] => 46 [cpu] => 0 [mu] => 992 [pmu] => 0 ) [foo==>strlen] => Array ( [ct] => 2 [wt] => 15 [cpu] => 0 [mu] => 416 [pmu] => 0 ) [bar==>bar@1] => Array ( [ct] => 1 [wt] => 9 [cpu] => 0 [mu] => 416 [pmu] => 0 ) [main()==>foo] => Array ( [ct] => 1 [wt] => 224 [cpu] => 0 [mu] => 2144 [pmu] => 0 ) [main()==>xhprof_disable] => Array ( [ct] => 1 [wt] => 5 [cpu] => 0 [mu] => 432 [pmu] => 0 ) [main()] => Array ( [ct] => 1 [wt] => 275 [cpu] => 0 [mu] => 3304 [pmu] => 0 ) )
其中个项的意思为:
[foo==>bar] => Array ( [ct] => 2 [wt] => 46 [cpu] => 0 [mu] => 992 [pmu] => 0 
表示,bar()被foo()函数调用2次,bar()函数被调用后执行时间为46ms,bar()函数执行cpu占用为0,bar()函数执行引起的内存变化为992(?这个单位还不明确),pmu是记录的当bar()函数被foo()函数调用之后,执行使用的内存的peak值,为何这里是0?后续再查看下文档和xhprof的使用手册。

总体感觉,这个东西对于做代码层的性能监控很有帮助,同时在跟UC的同学交流时,发现他们的性能测试中也有用到xhprof,通过收集到的数据进行对比就可以知道该次版本的修改是否有造成性能的下降。看来,好的实践总是那么抢手,唉,可惜,今天才知道这个东西.......

由于本人能力有限,当中的理解如有错误,罅漏之处,还请多多指导,交流,谢谢
PS:以上部分内容转载自网络


TAG:

 

评分:0

我来说两句

Open Toolbar