0%

PHP 性能分析工具使用 - xhprof

什么是 xhprof?

xhprof 是一个轻量级 PHP 性能分析工具。

它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU 时间和内存使用情况。

注意:xhprof 的使用开销很大,所以只能在本地开发调试的时候使用。

安装

我们可以通过 pecl 来安装 xhprof

1
2
# 目前最新版本是 2.3.9
pecl install xhprof-2.3.9

安装完之后,运行一下 php -m 查看是否已经启用:

1
php -m

最后,修改一下 php.ini 配置文件,添加以下配置:

1
xhprof.output_dir = /tmp/xhprof

注意:这里指定的文件夹必须有写的权限才行。

当然,我们也可以通过源码编译安装,源码在 https://github.com/longxinH/xhprof

使用

主要有两个步骤:

  1. 使用 xhprof_enable 来开启 xhprof 性能监控
1
2
3
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS +
XHPROF_FLAGS_CPU +
XHPROF_FLAGS_MEMORY);
  1. 注册一个 shutdown 处理器

它的作用是在 php 请求处理完毕的时候将性能指标数据写入到文件中,如果没有这个,则在 xhprof.output_dir 中将不会有任何输出。

1
2
3
4
5
6
7
8
9
register_shutdown_function(function(){
$data = xhprof_disable(); //返回运行数据
// 需要在 https://github.com/longxinH/xhprof 下载源码,下面的 `.../xhprof_lib` 就是下载源码中的 `xhprof_lib` 目录
// 这里需要替换为自己本地的路径
include '/Users/ruby/Code/xhprof-2.3.9/xhprof_lib/utils/xhprof_lib.php';
include '/Users/ruby/Code/xhprof-2.3.9/xhprof_lib/utils/xhprof_runs.php';
$objXhprofRun = new XHProfRuns_Default();
$objXhprofRun->save_run($data, "test"); //test 表示文件后缀
});

通过 HTML 页面展示性能分析结果

  1. 我们在本地的 nginx 中添加一个 xhprof web 服务的配置:
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
server {
listen 8088;
server_name xhprof.local;
root /Users/ruby/Code/xhprof-2.3.9;

add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";

index index.php;

charset utf-8;

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }

error_page 404 /index.php;

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}

location ~ /\.(?!well-known).* {
deny all;
}
}
  1. 重启本地的 php-fpm

  2. 在我们的 /etc/hosts 中加上 nginx 中配置的域名即可

  3. 打开浏览器,访问 http://xhprof.local:8088/xhprof_html/

xhprof
  1. 点击其中一个进去,可以看到详情
xhprof

在这里,我们还能点击每一列的表头,让它按这一列来排序。上图我就按 Calls 逆序排序了。

以图的形式来展示

上面我们通过表格的方式来看到了函数调用的次数、时间等,但表格其实不够直观。

我们也看到上面图中的正中间有一个 View Full Callgraph 的超链接,我们可以通过这个超链接来查看具体的函数调用链, 这样我们可以更加直观的知道调用入口在哪里,以及整个调用链条大概长什么样子的。

xhprof

图太大了,这里随便看看吧

注意:要使用这个功能,我们需要安一个插件 graphviz。mac 下可以通过 brew install graphviz,其他的自行搜索。