什么是 XHPROF?javascript
XHPROF
:Facebook 开源的轻量级PHP性能分析工具。php
它报告函数级别的请求次数和各类指标,包括阻塞时间,CPU时间和内存使用状况。html
XHProf 分析报告有助于理解被执行的代码的结构。java
它有一个简单的HTML的用户界面( PHP写成的)。mysql
基于浏览器的性能分析用户界面能更容易查看,或是与同行们分享成果。nginx
也能绘制调用关系图。git
XHPROF 与 Xdebug 区别github
Xdebug 是一个开放源代码的PHP程序调试器(即一个Debug工具)。sql
对于本地开发环境来讲,进行性能分析 Xdebug 是够用了。shell
但若是是线上环境的话,Xdebug 消耗较大,配置也不够灵活。
如何安装 XHPROF ?
//源码安装
cd /usr/local/src
wget http://pecl.php.net/get/xhprof-0.9.4.tgz
tar zxvf xhprof-0.9.4.tgz
cd xhprof-0.9.4/extension/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install
//在 php.ini 末尾新增
[xhprof]
extension = xhprof.so
xhprof.output_dir = 自定义文件夹(/tmp/xhprof_log)
// /tmp/xhprof_log 必须存在且有写入权限
//重启环境
//代码中查看 phpinfo 是否包含 xhprof。
//一切顺利的话,那么 xhprof 安装成功。复制代码
如何配置 XHPROF?
//好比项目地址:local.test_xhprof.com
//在项目入口文件中新增一下代码(CI框架为例)
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS +
XHPROF_FLAGS_CPU +
XHPROF_FLAGS_MEMORY);
register_shutdown_function(function(){
$data = xhprof_disable(); //返回运行数据
//xhprof_lib 在下载的包里存在这个目录,记得将目录包含到运行的php代码中
include '/home/www/mi/xhprof/xhprof_lib/utils/xhprof_lib.php';
include '/home/www/mi/xhprof/xhprof_lib/utils/xhprof_runs.php';
$objXhprofRun = new XHProfRuns_Default();
$objXhprofRun->save_run($data, "test"); //test 表示文件后缀
});
//一切顺利的话,那么代码安装成功。
//访问:local.test_xhprof.com,应该在 /tmp/xhprof_log 存在日志文件。复制代码
如何 UI 展现?
//将 xhprof_html、xhprof_lib 拷贝到虚拟目录中
cd /usr/local/src
cp xhprof-0.9.4/xhprof_html /home/www/mi/xhprof/xhprof_html
cp xhprof-0.9.4/xhprof_lib /home/www/mi/xhprof/xhprof_lib复制代码
配置虚拟主机(local.xhprof.com)
local.xhprof.com 指向 /home/www/mi/xhprof/ 便可。
访问:local.xhprof.com/xhprof_html 会显示日志文件。
以下图:
点击日志文件显示下图。
点击 [View Full Callgraph] 会显示调用关系图。
在生成图的时候须要服务器装一个插件:graphviz。
cd /usr/local/src
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
tar zxvf graphviz-2.24.0.tar.gz
cd graphviz-2.24.0
./configure
make
make install
//一切顺利的话,那么 graphviz 安装成功。复制代码
若是点击 [View Full Callgraph] 依旧没法打开。
报错:failed to execute cmd " dot -Tpng"
表示:php.ini 中一些执行函数禁用了。
在 php.ini 中 去掉 disable_functions 中的以下函数
system
shell_exec
proc_open
proc_get_status
PHP 重启一下。
一切顺利的话,应该不会报错了,就能够看到高大上的效果图啦。
点击局部,能够看到大图。
以上,你们能够看到 函数级别的请求次数和各类指标,包括阻塞时间,CPU时间和内存使用状况。
如何更好的UI展现?
可能你们有一些疑问:
接下来给你们介绍:xhprof gui
xhprof gui : 一个xhprof的一个ui展示。
使 xhprof 界面更漂亮,功能更强大。
如何配置 xhprof gui
下载后存放到:xhprof_gui 文件中。
配置虚拟主机(local.xhprofgui.com)
local.xhprofgui.com 指向 /home/www/mi/xhprof_gui/ 便可。
第一步,须要将 xhprof_gui/xhprof_lib/config.sample.php 重命名 为 config.php。
第二步,根据 config.php 中数据库变量(dbuser、dbpass、dbname),配置一个数据库。
第三步,将 config.php 中 doprofile 设置为 true。
第三步,建立一张表。
//源代码:xhprof_lib/utils/xhprof_runs.php
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;复制代码
若是是 Nginx 服务器 新增配置:
fastcgi_param PHP_VALUE "auto_prepend_file=/home/www/mi/xhprof_gui/external/header.php";复制代码
若是是 Apache 服务器:
php_admin_value auto_prepend_file "/home/www/mi/xhprof_gui/external/header.php"复制代码
配置到这里,能够运行下。
简单说明下:
若是你配置在公共的配置文件中,那么表示站点上全部的域名访问都会进行日志记录。
若是你配置在单个域名的配置文件中,表示只有访问当前域名的时候回进入日志记录。
例如单个域名为:local.xh.test.com
若是报错,能够调试下 header.php。
以上配置,存储使用的是Mysql。
存储也可使用MongoDB,你们能够研究下 ~
若是看到效果?
访问 local.xh.test.com,记录日志。
访问 local.xhprofgui.com,查看效果。
效果图,以下:
我本地为 nginx 环境,已经配置成功。
若是你们须要下载我配置的好的 xhprof_gui 类库。
能够关注微信公众号,回复 “xhprof” 便可。
那么问题来了,分析出效率低的地方如何进行调整?
有经验的同窗,能够留言哈 ~
Thanks ~
做者:PHP后端开发者
免费提供技术咨询服务(本身懂的知识)。
QQ群:564557094。
关注微信公众号,留言便可,看到留言后会及时回复。