使用XHProf查找PHP性能瓶颈

简介

XHProf是facebook开发的一个测试php性能的扩展,XHProf对PHP进行性能优化,查找性能瓶颈的方法。

其他类似工具

安装xhprof

1
2
3
4
git clone https://github.com/phacility/xhprof.git && cd xhprof
phpize
./configure --with-php-config=/php/bin/php-config --enable-xhprof
make && make install

修改php.ini

1
2
3
[xhprof]
extension=xhprof.so
xhprof.output_dir=/home/xhprof # 定义输出文件的存放位置

重启php-fpm服务,使用php -m 查看扩展是否安装成功

对PHP进行性能分析

在XHProf扩展中,一共提供了四个函数用于对PHP进行性能分析.

xhprof_enable/xhprof_sample_enable函数用于开始XHProf性能分析,区别在于前者功能更加强大,而后者则是是以简单模式启动性能分析(简单记录了函数的调用栈信息),开销比较小。

xhprof_disable/xhprof_sample_disable函数用于停止性能分析,并返回分析的数据

需要特别说明的函数是xhprof_enable,其他函数都是不需要提供参数的,而该函数则可以接受两个可选的参数,用于改变该工具的行为。

xhprof_enable()函数

1
void xhprof_enable ([ int $flags = 0 [, array $options ]] )
  • flags 该参数用于为剖析结果添加额外的信息,该参数的值使用以下宏,如果需要提供多个值,使用 | 进行分隔。
  • XHPROFFLAGSNO_BUILTINS 跳过所有的内置函数
  • XHPROFFLAGSCPU 添加对CPU使用的分析
  • XHPROFFLAGSMEMORY 添加对内存使用的分析
  • options 数组形式提供可选参数,在此处提供ignored_functions选项需要忽略的函数

例子

对内存和CPU进行分析,并且忽略对call_user_func和call_user_func_array函数的分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
xhprof_enable(
XHPROF_FLAGS_MEMORY|XHPROF_FLAGS_CPU,
[
'ignored_functions' => [
'call_user_func',
'call_user_func_array'
]
]
);
// 这里是PHP代码,比如业务逻辑实现等要被分析的代码部分
....
$xhprofData = xhprof_disable();// $xhprofData是数组形式的分析结果
print_r($xhprofData);

形象化的查看分析结果

使用xhprof_disable完成性能分析并且获取到分析结果之后,我们通常不会直接输出结果,因为这样的结果是以数组形式组织的,看起来并不直观。xhprof提供了基于web的图形界面对分析结果进行查看。

在使用之前,请先确保服务器安装了graphviz工具,否则在生成监控图表的时候回出现以下错误:

1
failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '

这里提示找不到dot命令,所以需要先安装graphviz

1
yum install graphviz

由于分析结果的查看工具是基于web的,因此,我们需要将xhprof安装包中的xhprofhtmlxhproflib目录放到服务器的web目录下,让xhprof_html目录中的内容对外可以访问。

访问地址为http://localhost/xhprof_html/index.php

我们需要修改我们的代码,是其能够将分析结果存放到xhprof.output_dir指定的目录中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
xhprof_enable(
XHPROF_FLAGS_MEMORY|XHPROF_FLAGS_CPU,
[
'ignored_functions' => [
'call_user_func',
'call_user_func_array'
]
]
);
function test1() {
$y=10;
testcpu();
}
function testcpu() {
for ($x=0; $x<=100000; $x++) {
}
}
test1();
$xhprofData = xhprof_disable();
require '/xhprof/xhprof_lib/utils/xhprof_lib.php';
require '/xhprof/xhprof_lib/utils/xhprof_runs.php';
$xhprofRuns = new XHProfRuns_Default();
$runId = $xhprofRuns->save_run($xhprofData, 'xhprof_test');
echo 'http://localhost/xhprof_html/index.php?run=' . $runId . '&source=xhprof_test';

变量$runId本次请求生成分析结果的id,最后我们输出了一个链接地址,使用该地址就可以看到本次请求的分析结果。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器