本文介绍XHGui(MySQL版)的安装、配置和使用。
XHGui基于XHProf,但是较XHpro更加便捷直观,因为它不需要修改项目代码,而且以图形化方式显示结果。
1 安装XHprof
1.1 安装PHP开发版
首先要安装PHP Dev版,后面用到它里面的phpize
和pecl
支持:
$ 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.php 为 config.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
就能看到详细的报告。
默认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”,就能看到调用关系图了。如下。
7 术语说明
在查看 Xhprof 或 XHGUI 性能数据时,会遇到以下几个术语,其含义对应如下:
Calls
/Call Count
:函数被调用的次数Incl. Wall Time
/Wall Time
:执行该函数(包括子函数)耗费的时间Incl. MemUse
/Memory Usage
:该函数(包括子函数)占用的内存Incl. PeakMemUse
/Peak Memory Usage
:函数(包括子函数)占用内存的峰值Incl. CPU
/CPU
:执行该函数(包括子函数)花费的CPU时间Excl. Wall Time
/Exclusive Wall Time
:函数本身(不包括子函数)耗费的时间Excl. MemUse
/Exclusive Memory Usage
:函数本身(不包括子函数)占用的内存Excl. PeakMemUse
/Exclusive Peak Memory Usage
:函数本身(不包括子函数)耗费内存的峰值Exclusive CPU
:函数本身(不包括子函数)花费的CPU时间
Inclusive
简写Incl
,表示测量到的数据是函数本身及所有调用的子函数总共耗费占用的资源。
Exclusive
简写Excl
,则表示不包含调用的子函数耗费占用的资源。
另外,所有测量值都是每个函数调用在次数上的叠加。
参考资料: