PHP性能追踪及分析工具xhprof的安装与使用
对于本地开发环境来说,进行性能分析xdebug是够用了,但如果是线上环境的话,xdebug消耗较大,配置也不够灵活,因此线上环境建议使用xhprof进行PHP性能追踪及分析。
我们今天就简单介绍一下xhprof的简单安装与使用
xhprof的安装
下载xhprof,我们这里选择的是通过git clone的方式,当然你也可以从 http://pecl.php.net/package/xhprof 这里下载。
cd /usr/local/src
# 我自己汉化的版本
git clone https://github.com/maxincai/xhgui.git
# 你可以clone原版
git clone https://github.com/phacility/xhprof.git
注意:
php5.4及以上版本不能在pecl中下载,不支持。需要在github上下载hhttps://github.com/phacility/xhprof.git。
另外xhprof已经很久没有更新过了,截至目前还不支持php7,php7可以试使用https://github.com/tideways/php-profiler-extension。
安装xhporof
cd xhprof/extension
/usr/local/php5.6/bin/phpize
./configure --with-php-config=/usr/local/php5.6/bin/php-config --enable-xhprof
make
make install
最后如果出现类似的提示信息,就表示编译安装成功
stalling shared extensions: /usr/local/php-5.6.14/lib/php/extensions/no-debug-non-zts-20131226/
修改配置文件/etc/php5.6.ini,在最后增加如下配置
[xhprof]
extension=xhprof.so
xhprof.output_dir=/data/www/xhprof/output
重启php-fpm后通过phpinfo查看,或者在命令行通过php -m | grep xhprof查看是否安装成功。
注意:
需要创建output_dir
mkdir -p /data/www/xhprof/output
xhprof的简单用法
将下载的xhprof复制到webroot目录,我这里以/data/www/project-xhprof为例
mkdir /data/www/project-xhprof
cp -R /usr/local/src/xhprof/* /data/www/project-xhprof/
cd /data/www/project-xhprof
在nginx中增加站点配置
server {
listen 80;
server_name xhprof.dev;
root /data/www/project-xhprof;
index index.php index.html;
access_log /var/log/nginx/xhprof.dev.log main;
error_log /var/log/nginx/xhprof.dev.log.err debug;
rewrite_log on;
location ~* \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php5.6-fpm.sock;
fastcgi_index index.php;
}
}
重启nginx,然后使用http://xhprof.dev/examples/sample.php,可以看到一些输出,并且提示通过访问http://
分析一下示例代码sample.php,关健代码:
<?php
// 开始分析
xhprof_enable();
// 运行一些函数
foo();
// 停止分析,得到分析数据
$xhprof_data = xhprof_disable();
$xhprof_data中记录了程序运行过程中所有的函数调用时间及CPU内存消耗,具体记录哪些指标可以通过xhprof_enable的参数控制,目前支持的参数有:
- HPROF_FLAGS_NO_BUILTINS 跳过所有内置(内部)函数。
- XHPROF_FLAGS_CPU 输出的性能数据中添加 CPU 数据。
- XHPROF_FLAGS_MEMORY 输出的性能数据中添加内存数据。
之后的处理已经与xhprof扩展无关,大致是编写一个存储类XHProfRuns_Default,将$xhprof_data序列化并保存到某个目录,可以通过XHProfRuns_Default(__DIR__)将结果输出到当前目录,如果不指定则会读取php.ini配置文件中的xhprof.output_dir,仍然没有指定则会输出到/tmp。
xhprof_html/index.php将记录的结果整理并可视化,默认的UI里列出了:
- funciton name : 函数名
- calls: 调用次数
- Incl. Wall Time (microsec): 函数运行时间(包括子函数)
- IWall%:函数运行时间(包括子函数)占比
- Excl. Wall Time(microsec):函数运行时间(不包括子函数)
- EWall%:函数运行时间(不包括子函数)
在xhprof_html/index.php中还可以看到[View Full Callgraph]链接,点击后可以绘制出一张可视化的性能分析图,如果点击后报错的话,可能是缺少依赖graphviz,
graphviz是一个绘制图形的工具,可以更为直观的让你查看性能的瓶颈。
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
cd graphviz-2.24.0
./configure
make && make install
或者直接使用yum安装
yum install -y libpng
yum install -y graphviz
这时候就可以看到类似下面的效果
优雅的接入现有项目
通过上面的这些介绍,我们其实就已经可以将xhprof整合到任何我们已有的项目中,目前大部份的MVC框架都有唯一的入口文件,只需要在入口文件的开始处注入xhprof的代码:
<?php
//开启xhprof
xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
//在程序结束后收集数据
register_shutdown_function(function() {
$xhprof_data = xhprof_disable();
//让数据收集程序在后台运行
if (function_exists('fastcgi_finish_request')) {
fastcgi_finish_request();
}
//保存xhprof数据
...
});
我们不可能在我们需要分析的所有地方都加上,但是这样免不了要修改项目的源代码,其实php本身就提供了更好的注入方式,比如将上述逻辑保存为/data/www/xhprof/inject.php,然后修改php配置文件中的auto_prepend_file配置
auto_prepend_file = /data/www/xhprof/inject.php
对于 Apache 服务器,添加以下代码:
php_admin_value auto_prepend_file "/data/www/xhprof/inject.php"
对于 Nginx 服务器,在服务器配置中添加以下代码:
fastcgi_param PHP_VALUE "auto_prepend_file=/data/www/xhprof/inject.php";
这样所有的php请求文件都会自动注入/data/www/xhprof/inject.php这个文件,这样侵入性更小,并且可以实现基于站点的注入。
更漂亮的数据展示xhgui
注入代码后我们还需要实现保存xhprof数据以及展示数据的UI,现有的两个比较流行的两个轮子是 xhprof.io 和 xhgui 两个项目都差不多,但综合比较起来xhprof.io年久失修,xhgui还比较活跃,UI界面也相对比较美观,我这里就选择xhgui进行数据展示了。
安装xhgui
- 从github中clone代码至站点目录
/data/www/project-xhgui
mkdir /data/www/project-xhgui
cd /data/www/project-xhgui
git clone https://github.com/perftools/xhgui.git ./
设置缓存目录的权限,允许nginx创建文件
chmod -R 777启动
mongodb实例,如果mongodb如没有使用默认的端口和配置,或者有使用安全验证,刚需要修改config/config.php中的相关配置,我们这里使用的是默认配置,就不作修改了。为提高 MongoDB 的性能,你可以运行以下指令以添加索引:
$ /usr/local/mongodb/bin/mongo
> use xhprof
db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } )
db.results.ensureIndex( { 'profile.main().wt' : -1 } )
db.results.ensureIndex( { 'profile.main().mu' : -1 } )
db.results.ensureIndex( { 'profile.main().cpu' : -1 } )
db.results.ensureIndex( { 'meta.url' : 1 } )
安装
mongodb的PHP扩展
```
wget http://pecl.php.net/get/mongodb-1.1.9.tgz
tar zxvf mongodb-1.1.9.tgz
cd mongodb-1.1.9
/usr/local/php5.6/bin/phpize
./configure --with-php-config=/usr/local/php5.6/bin/php-config
make && make install
vim /etc/php5.6.ini在文件最后增加
[mongo]
extension=mongo.so
查看是否安装成功
php -m | grep mongo
重启php-fpm
/etc/init.d/php5.6-fpm restart
* 运行XHGui的安装脚本。安装脚本将通过composer安装XHGui的相关依赖。
php install.php
如果上面的命令执行报错,则执行下面的命令
composer install
* 配置web服务器,我们这里以nginx为例
server {
listen 80;
server_name xhgui.dev;
root /data/www/project-xhgui/webroot;
index index.php index.html;
access_log /var/log/nginx/xhgui.dev.log main;
error_log /var/log/nginx/xhgui.dev.log.err debug;
rewrite_log on;
location / {
try_files $uri $uri/ /index.php?$uri&$args;
}
location ~* \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php5.6-fpm.sock;
fastcgi_index index.php;
}
}
配置完成后重启nginx,这时候打开`http://xhgui.dev/`,就可以看到类似下面的页面

修改`/etc/php5.6.ini`中的`auto_prepend_file`配置完成xhgui的接入
auto_prepend_file = /data/www/project-xhgui/external/header.php
```
xhgui的具体使用
最近运行
也可以按时间范围和请求的地址进行搜索
可以按执行时间、CPU时间、内存占用进行排序
可以点击一个地址进去看这个地址的最近趋势
一次运行的详细
一个函数的运行详细
一次运行的函数调用图
一次运行的火焰图
对比多次请求
添加观察函数
PHP性能追踪及分析工具xhprof的安装与使用的更多相关文章
- PHP 性能追踪及分析工具(XHPROF)
原文:https://gold.xitu.io/post/5860d23f128fe10069e1cfbf XHPROF:Facebook 开源的轻量级PHP性能分析工具. 它报告函数级别的请求次数和 ...
- php性能分析工具 - xhprof的安装使用
一.前言 有用的东西还是记录下来吧,也方便以后的查询:这次记录一下xhprof的安装使用: xhprof是facebook开源出来的一个php轻量级的性能分析工具,跟Xdebug类似,但性能开销更低, ...
- PHP性能分析工具xhprof的安装使用与注意事项
前言 xhprof由facebook开源出来的一个PHP性能监控工具,占用资源很少,甚至能够在生产环境中进行部署. 它可以结合graphviz使用,能够以图片的形式很直观的展示代码执行耗时. 下面主要 ...
- 转:使用xhprof进行线上PHP性能追踪及分析
原文来自于:http://avnpc.com/pages/profiler-php-performance-online-by-xhprof 原创作者:AlloVince 之前一直使用基于Xdebug ...
- 如何使用工具进行线上 PHP 性能追踪及分析?
工作了一两年的 PHPer 大概都多多少少知道一些性能分析的工具,比如 Xdebug.xhprof.New Relic .OneAPM.使用基于 Xdebug 进行 PHP 的性能分析,对于本地开发环 ...
- golang 性能调优分析工具 pprof(下)
golang 性能调优分析工具 pprof(上)篇, 这是下篇. 四.net/http/pprof 4.1 代码例子 1 go version go1.13.9 把上面的程序例子稍微改动下,命名为 d ...
- golang 性能调优分析工具 pprof (上)
一.golang 程序性能调优 在 golang 程序中,有哪些内容需要调试优化? 一般常规内容: cpu:程序对cpu的使用情况 - 使用时长,占比等 内存:程序对cpu的使用情况 - 使用时长,占 ...
- 可视化日志分析工具Gltail的安装与使用
可视化日志分析工具Gltail的安装与使用 GlTail.rb 是一款带有浓郁的 Geek 风格的可视化日志分析工具,它采用 Ruby 技术构建,并利用 OpenGL 图形技术进行渲染,呈现 ...
- 如何在本地配置php分析工具xhprof
测试环境: linuxMint + nginx1.4.6+mysql5.5+php5.5 什么是xhprof? XHProf是一个分层PHP性能分析工具.它报告函数级别的请求次数和各种指标,包括阻塞时 ...
随机推荐
- 「暑期训练」「基础DP」 Common Subsequence (POJ-1458)
题意与分析 很简单:求最长公共子序列. 注意子序列与子串的差别:一个不连续一个连续.一份比较好的参考资料见:https://segmentfault.com/a/1190000002641054 状态 ...
- 阿里云ECS下基于Centos7.4安装MySQL5.7.20
1.首先登录阿里云ECS服务器,如下图所示: 2.卸载MariaDB 说明:CentOS7.x默认安装MariaDB而不是MySQL,而且yum服务器上也移除了MySQL相关的软件包.因为Maria ...
- 配置cas可外网访问
把应用程序tomcat下的conf下的context.xml里配置内容修改 如把: D:\apache-tomcat-APP\conf\context.xml <Resource name=&q ...
- kill命令详解
基础命令学习目录首页 原文链接:https://www.cnblogs.com/wangcp-2014/p/5146343.html 1.命令格式: kill[参数][进程号] 2.命令功能: 发送指 ...
- BZOJ 4184 shallot 线性基+分治
Description 小苗去市场上买了一捆小葱苗,她突然一时兴起,于是她在每颗小葱苗上写上一个数字,然后把小葱叫过来玩游戏. 每个时刻她会给小葱一颗小葱苗或者是从小葱手里拿走一颗小葱苗,并且让小葱从 ...
- Java 访问权限控制 小结
总所周知,Java提供了访问权限修饰词,以供类库开发人员向客户端程序员指明哪些是可用的,哪些是不可用的. 访问权限控制的等级,从最大权限到最小权限依次为:public.protected.包访问权限( ...
- 剑指offer:斐波那契数列
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:斐波那契数列 题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). n< ...
- linux基本操作2
将当前用户目录下的文件清单输出到文件list1.txt(当前用户目录下)中ls -l > list1.txt 利用管道命令将根(/)下所有修改日期在4月16日的文件清单输出到list2.txt( ...
- [转] UnityVS(Visual Studio Tools For Unity)的安装与使用
一些废话 Unity 的开发者们,尤其是微软系的Unity开发者们,用Mono是不是烦死了?你是不是跟我一样,用vs来写代码,用Mono来跟踪调试?好麻烦啊好麻烦. 也许你会说,傻逼你不会用Unity ...
- scrapy使用记录
1 进入pip安装目录 python -m pip install --upgrade pip pip install Scrapy 2. 创建一个项目 scrapy startproject tes ...