转载地址:http://avnpc.com/pages/profiler-php-performance-online-by-xhprof

使用xhprof进行线上PHP性能追踪及分析

日志未经声明,均为AlloVince原创。版权采用『 知识共享署名-非商业性使用 2.5 许可协议』进行许可。

之前一直使用基于Xdebug进行PHP的性能分析,对于本地开发环境来说是够用了,但如果是线上环境的话,xdebug消耗较大,配置也不够灵活,因此线上环境建议使用xhprof进行PHP性能追踪及分析。

xhprof的安装与简易用法

xhprof是Facebook开源的轻量级PHP性能分析工具,Linux环境下可以通过pecl直接安装,比如在Ubuntu下仅需3行指令

pecl install xhprof-beta
echo "extension=xhprof.so" > /etc/php5/fpm/conf.d/xhprof.ini
service php5-fpm restart

之后可以通过phpinfo()检查扩展是否已经加载。

具体如何使用呢,xhprof项目中已经提供了示例以及简易的UI,下载xhprof项目到web服务器,假设可以通过http://localhost/xhprof/访问,那么访问http://localhost/xhprof/examples/sample.php可以看到一些输出,并且提示通过访问http://<xhprof-ui-address>/index.php?run=XXX&source=xhprof_foo查看结果。接下来访问http://localhost/xhprof/xhprof_html/就可以看到已经保存的结果,列出了所有函数的调用以及所消耗的时间。

分析一下示例代码sample.php,关键部分只有2行:

//开启xhprof并开始记录
xhprof_enable();
//运行一些函数
foo();
//停止记录并取到结果
$xhprof_data = xhprof_disable();

$xhprof_data中记录了程序单步运行过程中所有的函数调用时间及CPU内存消耗等,具体记录哪些指标可以通过xhprof_enable的入口参数控制,之后的处理已经与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%:函数运行时间(不包括子函数)

每一项应该不难理解,以项目自带的sample.php为例,示例中编写了一个main()函数,main()函数中调用foo()bar()等一些子函数进行了一点字符处理。整个程序运行过程中,main()函数只运行了一次,并且由于main()函数中包括了所有的逻辑,所以main()函数的IWall%占比为100%,但是由于main()函数的功能都是由子函数实现的,因此main()函数的EWall%只有0.3%,而foo()函数完成了主要的工作,EWall%有98.1%。因此在分析更大型的程序时,往往需要根据这几项指标分别排序,从不同的角度审视性能消耗。

xhprof_html/index.php中还可以看到[View Full Callgraph]链接,点击后可以绘制出一张可视化的性能分析图,如果点击后报错的话,可能是缺少依赖graphviz,ubuntu可以通过apt安装

apt-get install graphviz

更好的注入方式

了解了上面这些,其实就已经可以将xhprof整合到任何我们已有的项目中去了。目前大部分MVC框架都有唯一的入口文件,只需要在入口文件的开始处注入xhprof的逻辑

//开启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本身就提供了更好的注入方式,比如将上述逻辑保存为/opt/inject.php,然后修改php fpm配置文件

vi /etc/php5/fpm/php.ini

修改auto_prepend_file配置

auto_prepend_file = /opt/inject.php

这样所有的php-fpm请求的php文件前都会自动注入/opt/inject.php文件

如果使用Nginx的话,还可以通过Nginx的配置文件设置,这样侵入性更小,并且可以实现基于站点的注入。

fastcgi_param PHP_VALUE "auto_prepend_file=/opt/inject.php";

更好的分析工具:xhprof.io还是xhpgui

注入代码后我们还需要实现保存xhprof数据以及展示数据的UI,听起来似乎又是一大堆工作,有现成的轮子可以用吗?

经过搜索和比较,貌似比较好的选择有xhprof.io以及xhpgui。

两个项目做得事情差不多,都提供了xhprof数据保存功能以及一套索引展示数据的UI,下面是一些比较

xhprof.io

  • ✗ 年久失修
  • ✗ 保存xhprof数据到MySQL
  • ✓ 支持域名、URI等多个维度的数据索引
  • ✓ 函数调用记录完整,内核级别函数都能显示
  • ✗ 无法针对个别URI开启
  • ✗ 注入被分割成两个文件,如果程序被强制中断时xhprof数据将无法收集

xhgui

  • ✓ 保存xhprof数据到MongoDB
  • ✗ 不支持域名索引
  • ✗ 函数调用记录不完整,部分内核级别函数(如扩展内)无法显示
  • ✓ 有配置文件可以控制开启条件
  • ✓ 注入只有一个文件
  • ✓ 狂拽酷炫的基于D3.js的调用关系动态图

可以看到其实两个项目都不够完善,相对而言xhgui不支持域名索引对于线上调试来说是无法忍受的,因此我最后的选择是使用xhprof.io,但是自己进行了微量的调整,修改后的xhprof.io修正版支持:

  • ✓ 增加开启开关配置,可以针对个别URI开启
  • ✓ 注入文件合并为一个

xhprof.io修正版安装与使用

安装及配置方法如下,假设web服务器根目录为/opt/htdocs

cd /opt/htdocs
git clone https://github.com/EvaEngine/xhprof.io.git
cd xhprof.io/
composer install
cp xhprof/includes/config.inc.sample.php xhprof/includes/config.inc.php
vi xhprof/includes/config.inc.php

在MySQL中建立xhprof.io数据库,假设数据库名为xhprof,然后导入xhprof/setup/database.sql

配置文件config.inc.php中需要调整

  • 'url_base' => 'http://localhost/xhprof.io/', 这是xhprof.io界面所在路径
  • 'pdo' => new PDO('mysql:dbname=xhprof;host=localhost;charset=utf8', 'root', 'password'), 根据MySQL实际情况调整配置
  • enable 这是一个匿名函数,当匿名函数返回true时启用xhprof数据收集

通过配置enable项,就可以实现线上调试的需求,比如

始终开启xhprof

'enable' => function() {return true;
}

1/100概率随机开启xhprof

'enable' => function() {return rand(0, 100) === 1;
}

网页携带参数debug=1时开启xhprof

'enable' => function() {return !empty($_GET['debug']);
}

网页URL为特定路径时开启

'enable' => function() {return strpos($_SERVER['REQUEST_URI'], '/testurl') === 0;
}

最后按上文所述,在要配置的项目中包含xhprof.io/inc/inject.php即可。

线上环境操作时务必要胆大心细,如果没有结果尤其注意需要检查xhprof扩展是否安装

附录:xhpgui的安装方法

apt-get install mongodb php5-mongo php5-mcrypt
cp /etc/php5/mods-available/mcrypt.ini /etc/php5/fpm/conf.d/
cp /etc/php5/mods-available/mcrypt.ini /etc/php5/cli/conf.d/
cd /opt/htdocs
git clone https://github.com/perftools/xhgui.git
cd xhgui
composer install
cp config/config.default.php config/config.php
chown www-data.www-data -R cache

编辑Nginx配置文件加入

fastcgi_param PHP_VALUE "auto_prepend_file=/opt/htdocs/xhgui/external/header.php";

收集数据过多时可以清空mongodb

mongo
use xhprof;
db.dropDatabase();

xhprof进行线上PHP性能追踪及分析相关推荐

  1. 如何使用工具进行线上 PHP 性能追踪及分析?

    工作了一两年的 PHPer 大概都多多少少知道一些性能分析的工具,比如 Xdebug.xhprof.New Relic .OneAPM.使用基于 Xdebug 进行 PHP 的性能分析,对于本地开发环 ...

  2. php mysql 网站性能分析工具_如何使用工具进行线上 PHP 性能追踪及分析?

    工作了一两年的 PHPer 大概都多多少少知道一些性能分析的工具,比如 Xdebug.xhprof.New Relic .OneAPM.使用基于 Xdebug 进行 PHP 的性能分析,对于本地开发环 ...

  3. PHP性能追踪及分析工具xhprof的安装与使用

    PHP性能追踪及分析工具xhprof的安装与使用 对于本地开发环境来说,进行性能分析xdebug是够用了,但如果是线上环境的话,xdebug消耗较大,配置也不够灵活,因此线上环境建议使用xhprof进 ...

  4. 如何在大流量场景下云淡风轻地进行线上发布?

    简介:本文介绍了微服务治理下金丝雀发布的能力,解决了发布期间少量流量验证新功能的问题. 前言 本文,我们继续聊聊<揭秘大流量场景下发布如丝般顺滑背后的原因>中的另外一环,灰度发布,也叫金丝 ...

  5. 大流量场景下如何云淡风轻地进行线上发布?

    简介: 本文介绍了微服务治理下金丝雀发布的能力,解决了发布期间少量流量验证新功能的问题. 前言 本文,我们继续聊聊<揭秘大流量场景下发布如丝般顺滑背后的原因>中的另外一环,灰度发布,也叫金 ...

  6. 后疫情时代还有必要进行线上教学的必要吗?

    后疫情时代还有必要进行线上教学的必要吗? 后疫情时代还有必要进行线上教学的必要吗? 有危即有机.在这次疫情影响下,教育行业虽然经历了一系列的困难洗礼,但也迎来了一次机遇,疫情期间是一个需求激发.全民参 ...

  7. 【教程】利用OBS+腾讯会议进行线上考试

    前言: 由于腾讯会议只能一人共享屏幕,而考试需要每个人开启屏幕和开启摄像头监控(确保电脑有摄像头),所以使用这种方法(适用于电脑端,不是手机端哦!) 准备: 1.腾讯会议 https://meetin ...

  8. 优雅的进行线上数据订正

    在系统开发上线过程中,难免会遇到在测试过程中没有覆盖到的场景,而且还有可能生成脏数据.这个时候就需要对错误数据进行一一修改了.如果遇到需要修改的数据量比较少,那么可以进行手动的编辑 SQL.如果数据量 ...

  9. 新零售一般使用什么进行线上线下互通

    新零售一般使用什么进行线上线下互通,这个问题一直很多人在研究. 线上线下的商品信息.库存需要互通,肯定是需要在一处处理,或者 在多处使用api进行对接,以保持商品信息和库存信息的一致性,目前处理这一块 ...

最新文章

  1. linux trap命令
  2. c++学习笔记之指针
  3. explorer.exe被删除了怎么办?
  4. 学习共享--产品思维
  5. oracle 数据误删除 数据恢复
  6. win10 游戏等应用打开时闪退解决方案
  7. 教师对php作品评语通用,教师批改作业100例精彩评语,太有用了!
  8. 收集12个经典的程序员段子
  9. configure: error: GD build test failed. Please check the config.log
  10. ros驱动insta360 oneR运动相机遇到的坑
  11. VPS云主机怎么用?
  12. 知识社会的到来:知识管理与知识协同
  13. 每日一技:给女友用代码做一个3D旋转相册,每天亿遍忘记初恋~
  14. 终于可以不用radmin了
  15. 王阳明心学层级图——适合内心困惑的人了解
  16. 在ubuntu下烧写映像文件到SD卡--基于三星210开发板
  17. 移动端 input 调用手机键盘搜索功能
  18. 快速安装YouCompleteMe自动补全插件
  19. 博弈论Nim取子问题,困扰千年的问题一行代码解决
  20. DOC文件中法律法规规程规范对标系统

热门文章

  1. Dundas绘制趋势线
  2. 半闲居士视觉SLAM十四讲笔记(2)初识 SLAM- part 2 linux CMake、Kdevelop
  3. java 简单的聊天工具 (带界面的)
  4. 各位mm和gg互相关注,互踩呀
  5. 人脸常用数据集下载地址
  6. 打工与创业你该怎样选择?其实主要还是因人而异!
  7. [更新SIP配置方法简要说明] Apple SIP/Rootless安全技术介绍+测试分析及配置方法
  8. 老外的个人网站原来是这样设计的:17个最佳范例给你灵感
  9. 中国石油601857
  10. Spring详细总结