xhprof是facebook开发的,用来对php程序进行profiling的。具体的就是给你展示下,每个函数运行了多长时间、消耗了多少内存。另外一个比较好的功能就是可以生成函数调用关系。这个对于梳理业务还有框架的原理都很有用。
安装xhprof
可使用pear或者pecl安装,我目前使用的xhprf 0.9.4,有下面的要求
PHP Version: PHP 5.2.0 or newer
PEAR Package: PEAR 1.4.0 or newer
当然,如果你没有办法安装上面两个包管理工具,也可以从上面的地址下载安装包,然后自己编译。
$ cd xhprof-0.9.4/extension
$ phpize
$ ./configure --with-php-config=/usr/local/bin/php-config
$ make
$ make test
$ make install
在我的环境中,make test
一共有8个case,还是有一个case没有过的,不过我没有深究,依然还是make install
了。希望在以后的版本中修改掉把。
根据php版本或平台的不同,请确保你的php可以加载编译出来的xhprof.so。在我的机器上,我手动添加了
/usr/local/etc/php/5.5/conf.d/ext-xhprof.ini
文件内容:
[xhprof]
extension="/usr/local/opt/php55-xhprof/xhprof.so"
xhprof.output_dir="/var/tmp/xhprof"
其中xhprof.output_dir
指定了xhprof所抓取的运行时信息。
安装Libpng & Graphviz
为了显示函数调用关系,xhprof自带了一个网页,可以分析它所收集的数据,然后生成函数调用树。这个功能是要用到Graphviz,而Graphviz又要用到libpng,:)
我使用的版本是
graphviz : 2.38.0
libpng : 1.6.17
启用xhprof
include_once 'xhprof_lib/utils/xhprof_lib.php';
include_once 'xhprof_lib/utils/xhprof_runs.php';
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
上面这三句话就是说打开xhprof,让其开始搜集数据。
xhprof_enable还可以指定其他的参数,具体的参数,大家可以到网上自行搜索啦。
$xhprof_data = xhprof_disable();
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace);
而这三句话就是说,要结束我们的数据收集,把它写入文件。那么数据保存在哪里呢?还记得上面我们给php配置module是指定的xhprof.output_dir吗?对,数据就保存在那里面。
在我的环境中,我的项目使用了symfony1.4,而我希望它可以检测我所有的代码。这样,我就可以对它们逐一进行分析。
所以,在apps/my_app_name/templates
目录下,我添加了两个文件
header.php
<?php
if (extension_loaded('xhprof')) {
include_once 'xhprof_lib/utils/xhprof_lib.php';
include_once 'xhprof_lib/utils/xhprof_runs.php';
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
echo 'xhprof loaded';
}
footer.php
<?php
if (extension_loaded('xhprof')) {
$profiler_namespace = 'myproj'; // namespace for your application
$xhprof_data = xhprof_disable();
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace);
}
然后在symfony的layout.php文件里,把上面两个文件include进去。这样,symfony里面的每个页面都被xhprof监控了。
OK,这样来看,是不是会影响线上环境呢?应该不会,只要线上环境不安装xhprof这个模块,那么该功能就不会启用,也就不会有什么影响啦。
查看结果
数据室收集了,你去看上面收集的数据,都是json数据很不直观。
xhprof自带了一个数据查看程序,都是用php写的。
$ cd xhprof-0.9.4
$ php -S 0:8080 -t xhprof_html/
OK,在你的浏览器中输入localhost:8080
就可以查看结果了,是不是很方便?