本文先容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 xhprofxhprofxhprof => 0.9.2CPU 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
,则表示不包含调用的子函数耗费占用的资源。
其余,所有丈量值都是每个函数调用在次数上的叠加。