XHGui安装和使用教程

本文介绍XHGui(MySQL版)的安装、配置和使用。

XHGui基于XHProf,但是较XHpro更加便捷直观,因为它不需要修改项目代码,而且以图形化方式显示结果。

1 安装XHprof

1.1 安装PHP开发版

首先要安装PHP Dev版,后面用到它里面的phpizepecl支持:

$ sudo yum install php-devel -y       # CentOS
$ sudo apt-get install php5-dev       # Ubuntu

然后,按命令或源码两种方式之一安装XHprof。

1.2 命令安装

命令安装需要用到pecl,如下:

$ sudo yum install php-pear -y
$ sudo pecl install xhprof-beta -y

在Linux 64位系统,安装程序会自动库文件xhprof.so安装到目录:/usr/lib64/php/modules

1.3 源码安装

https://pecl.php.net/package/xhprof下载xhprof最新源码,解压后,进入源码目录安装,步骤:

$ cd xhprof-0.9.4/extension
$ /usr/bin/phpize
$ ./configure --with-php-config=/usr/bin/php-config
$ make
$ sudo make install

2 配置XHProf

打开 php.ini 文件,在文件最后加入以下两行:

[xhprof]
extension=xhprof.so

重启PHP-FPM:

$ sudo service php-fpm restart

查看xhprof是否安装成功,如下说明安装成功:

$ php --ri xhprof
xhprof
xhprof => 0.9.2
CPU num => 1

3 安装XHGui

3.1 下载源码

使用git工具克隆XHGui(MySQL版)到本地:

$ git clone https://github.com/preinheimer/xhprof.git

当然,也可以在github上下载源码压缩包,再在本地解压。

假设下载后XHGui源码地址为:/home/www/xhprof

3.2 Nginx配置

因为XHGui的数据要显示在浏览器上,所以必须配置一个能够访问的地址。

在服务器上新增一个站点,指向XHGui源码下面的xhprof_html目录。

Nginx配置如下:

server {
    listen 80;

    root /home/www/xhprof/xhprof_html;
    server_name xhprof.dev.com;
    index index.php;

    access_log /var/log/nginx/xhprof.log;

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

    location ~ .*\.(php|php5)?$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

然后修改host文件,指到 xhprof.dev.com 。

3.3 配置XHProf

重命名文件 xhprof_lib 目录下的 config.sample.phpconfig.php。编辑 config.php 文件,进行配置。

配置数据库和URL选项:

$_xhprof['dbhost'] = '127.0.0.1';
$_xhprof['dbuser'] = 'root';
$_xhprof['dbpass'] = '123456';
$_xhprof['dbname'] = 'xhprof';
$_xhprof['url'] = 'http://xhprof.dev.com';

对于开发环境,设置IP控制为false,并将其他行注释,如下:

 $controlIPs = false; //Disables access controlls completely. 
/*
$controlIPs = array();
$controlIPs[] = "127.0.0.1"; // localhost, you'll want to add your own ip here
$controlIPs[] = "::1"; // localhost IP v6
*/

3.4 导入数据库

在MySQL中新建一个名为 xhprof 的数据库,用如下的语句创建一个 details 表:

CREATE TABLE `details` (
 `id` char(17) NOT NULL,
 `url` varchar(255) default NULL,
 `c_url` varchar(255) default NULL,
 `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
 `server name` varchar(64) default NULL,
 `perfdata` MEDIUMBLOB,
 `type` tinyint(4) default NULL,
 `cookie` BLOB,
 `post` BLOB,
 `get` BLOB,
 `pmu` int(11) unsigned default NULL,
 `wt` int(11) unsigned default NULL,
 `cpu` int(11) unsigned default NULL,
 `server_id` char(3) NOT NULL default 't11',
 `aggregateCalls_include` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `url` (`url`),
 KEY `c_url` (`c_url`),
 KEY `cpu` (`cpu`),
 KEY `wt` (`wt`),
 KEY `pmu` (`pmu`),
 KEY `timestamp` (`timestamp`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

要获取最新语句,请参考XHGui源码下 xhprof_lib/utils/xhprof_runs.php 文件大约 109行的内容。

4 被分析网站配置

打开需要分析的网站的Nginx配置文件,加入如下一行:

location ~ .*\.(php|php5)?$ {
    #...
    fastcgi_param PHP_VALUE "auto_prepend_file=/home/www/xhprof/external/header.php";
 }

如果被分析网站用的是Apache,则这样配置:

<VirtualHost *:80>
  ...
  php_admin_value auto_prepend_file "/home/www/xhprof/external/header.php"
  ...
</VirtualHost>

这样header.php文件会在目标脚本执行之前自动解析执行。

5 开始分析

访问网站地址,假设要分析的网站是:localhost,则通过GET传入_profile=1变量,也就是访问:

http://localhost/?_profile=1

这样网站加载完成的同时,会把分析数据保存在MySQL数据库中。

再访问分析结果地址:

http://xhprof.dev.com

就会看到如下的报告结果,点击对应的TIMESTAMP就能看到详细的报告。

xhgui-timestamp

默认XHProf UI不会对PHP应用收集分析数据,在请求任意URL时,需添加GET参数_profile=1来启用。

external/header.php脚本会检查_profile参数,并将参数值写到cookie中setcookie('_profile', $_GET['_profile']);,这样就不用每次请求都带GET参数_profile=1,并且cookie是针对域名的,这样也就同域名下的其他URL请求启用了性能分析,然后对目标URL去掉参数_profile后发起重定向。对于不带GET参数_profile的URL请求,header.php会继续检查是否存在名为_profile的cookie,如果存在且值为布尔真,则设置条件变量启用性能分析,否则不启用。

若想要对已启用性能分析的域名禁用性能分析,则可以通过对URL请求添加GET参数_profile=0来禁用,因为header.php在检查cookie时发现_profile值为布尔假(0),所以不会启用性能分析。

6 图形化支持

在报告详情页面,有一个按钮“View Callgraph”,点击可以看到方法的调用关系,以及花费时间最多(红色)的方法,但是需要安装graphviz

安装方法:

$ sudo yum install graphviz

安装完成后,会生成文件:/usr/bin/dot,编辑config.php文件,确保 $_xhprof['dot_binary'] 的值是这个文件的位置。

然后点击“View Callgraph”,就能看到调用关系图了。如下。

xhprof-callgraph

7 术语说明

在查看 Xhprof 或 XHGUI 性能数据时,会遇到以下几个术语,其含义对应如下:

  1. Calls / Call Count:函数被调用的次数
  2. Incl. Wall TimeWall Time:执行该函数(包括子函数)耗费的时间
  3. Incl. MemUse / Memory Usage:该函数(包括子函数)占用的内存
  4. Incl. PeakMemUse / Peak Memory Usage:函数(包括子函数)占用内存的峰值
  5. Incl. CPU / CPU:执行该函数(包括子函数)花费的CPU时间
  6. Excl. Wall Time / Exclusive Wall Time:函数本身(不包括子函数)耗费的时间
  7. Excl. MemUse / Exclusive Memory Usage:函数本身(不包括子函数)占用的内存
  8. Excl. PeakMemUse / Exclusive Peak Memory Usage:函数本身(不包括子函数)耗费内存的峰值
  9. Exclusive CPU:函数本身(不包括子函数)花费的CPU时间

Inclusive简写Incl,表示测量到的数据是函数本身及所有调用的子函数总共耗费占用的资源

Exclusive简写Excl,则表示不包含调用的子函数耗费占用的资源

另外,所有测量值都是每个函数调用在次数上的叠加。

 

参考资料:

  1. Xhprof安装与使用
  2. PHP性能优化工具–xhprof安装
  3. How To Set Up XHProf and XHGui for Profiling PHP Applications on Ubuntu 14.04

6 条评论

m
mmmmcccc says: 回复

点击View Callgraph后我遇到failed to shell execute cmd=” “” -Tpng” proc_open(): Filename cannot be empty,你有没有遇到呢?

歪麦 says: 作者

要按照“6 图形化支持”安装graphviz,如果已经装了,那估计是另外的问题。

c
crowHo says:

框架的代码不能检测?按上面的配置,检测原生的php代码是ok的,但是检测TP,CI框架时,nginx会报错,*19 recv() failed (104: Connection reset by peer) while reading response header from upstream。望回复

a
ailenty says:

config文件 $_xhprof[‘dot_binary’] 这里注释要去掉

X
X先生 says: 回复

按照这样配置在laravel中不走register_shutdown_function,不知道是什么情况。我的PHP是5.5的。

歪麦 says: 作者

具体为什么估计调试一下才知道。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

昵称 *