如何使用 php 代码分析工具 xhprof
发布于 作者:苏南大叔 来源:程序如此灵动~

相比较phptrace、xdebug,xhprof的功能更加强大,但是对于代码来说,它是侵入式的。其基本功能的基础是要对php源码进行修改,必须嵌入这个扩展的相关代码,才能实现其强大的功能。所以,这样来说,是不是方便大家使用,就仁者见仁智者见智了。

苏南大叔将简要介绍一下xhprof的使用,本文的写作环境是php5.6.31下的xhprof,至于php7.2.0b3下的xhprof,虽然编译成功。但是在实际运行中,还是有一定的概率导致502错误。所以,这里并没有采用这个环境。大家如果要在php7下面使用xhprof的话,就还需要三思而行。详细的中文介绍,可以点击这里查看:http://doc.php.sh/zh/book.xhprof.html
放置库文件
代码需要能够访问到这两个目录,xhprof_lib和xhprof_html。但是这两个目录是否放置于网站根目录,就不一定了。对于xhprof_lib来说,需要能够被include到。而xhprof_html,需要能够通过地址访问到。所以,如果你不会配置nginx或者apache,那么简单的把这两组文件复制到网站根目录下面,是最好的选择。

对比sample.php埋点
官方源码里面有个examples/sample.php文件。

对比官方源码里面的example.php。我们可以知道:埋点分为两部分。
一部分是放在php文件主代码之前,见下面。
一部分是放在php文件主代码结束之,见下面。
运行代码,写入日志
运行代码后,就会按着php.ini中的『xhprof.output_dir = /tmp/xhprof』的设定,写入日志文件。所以,请确保对应的文件夹权限。

查看分析
运行 http://



funciton name : 函数名
calls: 调用次数
Incl. Wall Time (microsec): 函数运行时间(包括子函数)
IWall%:函数运行时间(包括子函数)占比
Excl. Wall Time(microsec):函数运行时间(不包括子函数)
EWall%:函数运行时间(不包括子函数)
可能需要安装的组件
如果最后一步,查看图表失败的话。如下图所示:

请安装graphviz即可。(centos下面是yum install)

小小的进阶
苏南大叔说了,这种调用方式,对代码本身是有侵入性的。事实上不是太友好。那么进阶的操作就是,把上述两个注入点,用下面的形式改写成一个单独的文件。
然后利用php.ini的auto_prepend_file功能,来把这个文件自动注入到源码中。这个idea其实是相当不错的。几乎把代码的侵入性降到了最低点。
当然,也可以通过nginx修改php.ini。效果是差不多的。
基本的使用教程就是这样的,更多有关xhprof的中文介绍。可以点击这里查看,http://doc.php.sh/zh/book.xhprof.html 。苏南大叔编写的xhprof系列教程,可以点击这里查看。https://newsn.net/tag/xhprof/ 。


