使用xhprof对PHP代码进行性能分析

xprof PHP扩展安装

参考php常用扩展安装

xhgui 的安装

xhgui 在国内安装会有点小困难,需要折腾以下玩意:

  • composer 国内网络环境比较恶心,你懂的
  • mongodb 服务端,就是数据库
  • mongodb 客户端,就是php扩展

下面开搞

xhgui源码包下载

cd /home/wwwroot
git clone https://github.com/perftools/xhgui.git
cd xhgui
php install.php

执行php install.php的时候,会自动下载composer.phar接着安装相关的依赖,如果无法正常
将依赖下载回来可以参考我原先整理的国内使用composer的正确姿势

成功安装xhgui的接口如下所示:

[vagrant@localhost xhgui]$ sudo php install.php
Downloading composer.
Installing dependencies.
Loading composer repositories with package information
Updating dependencies
- Installing slim/slim (2.3.1)
Downloading: 100%
- Installing slim/views (0.1.0)
Downloading: 100%
- Installing twig/twig (v1.13.1)
Downloading: 100%
- Installing pimple/pimple (v1.0.2)
Downloading: 100%
Writing lock file
Generating autoload files
Checking permissions for cache directory.
Permissions on cache/ are ok.

mongodb server 端安装

主要参考这里:Install MongoDB on Red Hat Enterprise or CentOS Linux

mongodb php 扩展安装

参考这里:php常用扩展安装

xhgui 对应的nginx参考配置如下

server
{
listen 80;
server_name xhprof.com;
index index.html index.htm index.php;
root /path/to/your/xhgui/webroot/;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
sendfile off;
location ~ \.php$ {
limit_req zone=one burst=10;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}

xhprof数据收集频率

因为是在本地,所以转为收集所有请求的分析数据,
将xhgui/config/config.php 里面的profiler.enable修改成下面的样子

'profiler.enable' => function() {
return true;
}

nginx 配置注入

这个其实就是在每个PHP请求前面都先加载xhprof的分析函数而已,没那么高深
nginx参考配置如下:

server {
listen 80;
server_name jia.99.dev;
root /path/to/your/webroot;
sendfile off;
location / {
index index.php index.html index.htm;
}
location ~ \.php$ {
fastcgi_param PHP_VALUE "auto_prepend_file=/path/to/your/xhgui/external/header.php"; # 重点
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
}

上面的header.php头是xhgui源码提供的,当然你也可以自己写

性能分析

在分析laravel的时候,注意如果直接xhprof_enable()会导致502的出现,使用如下方法即可替换

xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);

原始Bug:Segfault in xhprof_enable()

巨人的肩膀

xhgui
Profiling PHP Part 1: Intro to Xhprof & Xhgui
Profiling PHP Part 2: Xhgui In-Depth
Profiling PHP Part 3: Practical Performance Tuning