{Xhprof}
XhProf是一个分层PHP性能分析工具,可它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况。
[情况]
以 上两个应用Apache+php组合在Windows上是比较常见,一般用来组织开发环境,或者调试环境,或者测试环境,当然也有不少是用于生产环境的, 对于我而言,我是用他们来进行开发的,由于比较习惯了在Windows下面开发,尽管自己也搭建了基于Linux虚拟机的开发平台,用着也还可以,但总是 无法舍离Windows下的环境。
我 一直是eclipse+xdebug的方式开发调试,没有遇到太多的问题,开发也比较的顺利,不过昨天在测试一个页面的时候,发现php出现了一种类似锁 死的现象,即执行该页面后,php-cgi一直挂在进程里,既没有cpu消耗,也没有内存级数增长,仅仅是停留着不动,网页也不生成,百思不得其解,而且 仔细检查和调试代码也没有发现明显的瓶颈,另外我是在自己的6核电脑上测试的,文件系统也是正常的,锁死就变成了很奇怪的事情。我自己使用的是 Apache_1.3.37-Win32+php-5.2.6-Win32+Xdebug-2.1.2版本调试的,发现在调试过程中,整个eclipse 都处于无响应的状态,似乎这种锁死有传导性,故调试一直无法进行,由于写了比较多的代码,有点累,没有去想是什么具体原因,暂且休息一会。
在搜索的时候无意中发现了Xhprof工具,看了一些博主的文章,发现这个工具可以分析程序性能,值可能有一些粗略,是基于函数的,但却是很直观和清晰的,非常感兴趣,所以挂起了刚才的开发,研究下这个东西。
[过程]
由 于参考了好几个博文,而且都是基于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 for windows版本,这个没得说,地址:http://www.benjamin-carl.de/?download=XHProf-0.10.0-PHP-5.3.3-VC6-x86-TS,http://pan.baidu.com/share/link?shareid=239782&uk=337775431下载的zip文件解压缩后是一个dll文件,直接放到php的ext目录里面就可以了,如图1所示:
图1
然 后要把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。结果的话如图3所示:
图3
好了,至此为止,xhprof已经正确的安装好了。
接下来如何使用
第一首先要将下载解压的包里面的
xhprof_html目录和xhprof_lib目录复制到服务器web目录
(例如:cp -r xhprof_html xhprof_lib /home/wwwroot/)
如果我截图里面的就是复制到项目目录里面,反正要保证下面一步的程序能够访问到这两个目录,且有权限。
xhprof_enable();
然后在程序的末尾写上:
$xhprof_data = xhprof_disable();
$XHPROF_ROOT = realpath(dirname(__FILE__) .'/..');
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
$url = SITE."/xhprof_html/index.php?run=$run_id&source=xhprof_foo";
echo '<a href="'.$url.'">'.$url.'</a>';
而这里的包含路径请根据自己放置的位置而定。
最后在运行程序,在最底部就会发现我们echo的那个链接,点击就能看到性能表了