php轻量级的性能分析工具xhprof的安装使用


Posted in PHP onAugust 12, 2015

一、前言

有用的东西还是记录下来吧,也方便以后的查询;这次记录一下xhprof的安装使用;

xhprof是facebook开源出来的一个php轻量级的性能分析工具,跟Xdebug类似,但性能开销更低,

还可以用在生产环境中,也可以由程序开 关来控制是否进行profile。

二、安装

wget http://pecl.php.net/get/xhprof-0.9.3.tgz 
  tar zxf xhprof-0.9.3.tgz 
  cd xhprof-0.9.3/extension
  /usr/bin/phpize 
 (php版本安装后生成的phpize文件,可根据phpinfo查看,所以php版本不同,生成的phpize也不同,此步骤主要生成configure文件)
  ./configure ?with-php-config=/usr/bin/php-config 
 (php-config的路径,也是php安装后生成的文件) 
  make 
  sudo make install

 (会自动将生成的扩展文件拷贝到扩展目录中/usr/lib64/php/modules)

    当然具体的php文件的目录,每个人不尽相同,可根据phpinfo查询

三、php.ini配置

根据phpinfo找到 extension_dir的目录
(/etc/php.d/xhprof.ini)

添加一下内容:

extension=xhprof.so
xhprof.output_dir=/tmp/xhprof //xhprof的分析日志

四、重启服务

sudo /etc/init.d/http restart

 查看phpinfo是否安装成功

五、使用方法

开头:
xhprof_enable(); //开启监测 
//xhprof_enable(XHPROF_FLAGS_NO_BUILTINS); 不记录内置的函数 
//xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); 同时分析CPU和Mem的开销 

//要测试的代码
...
...
...

结尾:
$xhprof_data = xhprof_disable(); //停止监测,返回运行数据
$xhprof_root = '/(xhprof的虚拟主机目录)/'; 
 //引入当初安装到xhprof虚拟主机目录中的文件
include_once $xhprof_root."xhprof_lib/utils/xhprof_lib.php"; 
include_once $xhprof_root."xhprof_lib/utils/xhprof_runs.php";  
$xhprof_runs = new XHProfRuns_Default();  
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof");
echo '<a href="http://(xhprof的虚拟主机域名)/xhprof_html/index.php?run='.$run_id.'&source=xhprof" target="_blank">xhprof统计</a>';

上边的代码使用了,给xhprof设置虚拟主机的方法。

把源码包中的 xhprof_html 和 xhprof_lib 文件夹拷贝到自己建立的虚拟目录中

cp -r xhprof_html xhprof_lib /xxx/xhprof/  (此处目的是建立数据分析目录,可将此目录配置成虚拟主机访问)

运行后,统计点击返回的 xhprof统计 链接,即可。

六、注意问题以及名词解释

在显示的统计页面中,点[View Full Callgraph]图形化显示(最大的性能问题会用红色标出,其次是黄色);

点击后,可能提示错误消息,执行以下命令即可

yum install -y graphviz
 yum install graphviz-gd

名词解释

 

Function Name 函数名
 Calls 调用次数
 Calls% 调用百分比
 Incl. Wall Time (microsec) 调用的包括子函数所有花费时间 以微秒算(一百万分之一秒)
 IWall% 调用的包括子函数所有花费时间的百分比
 Excl. Wall Time (microsec) 函数执行本身花费的时间,不包括子树执行时间,以微秒算(一百万分之一秒)
 EWall% 函数执行本身花费的时间的百分比,不包括子树执行时间
 Incl. CPU(microsecs) 调用的包括子函数所有花费的cpu时间。减Incl. Wall Time即为等待cpu的时间
 减Excl. Wall Time即为等待cpu的时间
 ICpu% Incl. CPU(microsecs)的百分比
 Excl. CPU(microsec) 函数执行本身花费的cpu时间,不包括子树执行时间,以微秒算(一百万分之一秒)。
 ECPU% Excl. CPU(microsec)的百分比
 Incl.MemUse(bytes) 包括子函数执行使用的内存。
 IMemUse% Incl.MemUse(bytes)的百分比
 Excl.MemUse(bytes) 函数执行本身内存,以字节算
 EMemUse% Excl.MemUse(bytes)的百分比
 Incl.PeakMemUse(bytes) Incl.MemUse的峰值
 IPeakMemUse% Incl.PeakMemUse(bytes) 的峰值百分比
 Excl.PeakMemUse(bytes) Excl.MemUse的峰值
 EPeakMemUse% EMemUse% 峰值百分比

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";
PHP 相关文章推荐
用缓存实现静态页面的测试
Dec 06 PHP
实现了一个PHP5的getter/setter基类的代码
Feb 25 PHP
PHP 巧用数组降低程序的时间复杂度
Jan 01 PHP
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
May 18 PHP
PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
Aug 11 PHP
PHP检测移动设备类mobile detection使用实例
Apr 14 PHP
PHP实现服务器状态监控的方法
Dec 09 PHP
CentOS6.5 编译安装lnmp环境
Dec 21 PHP
Yii编程开发常见调用技巧集锦
Jul 15 PHP
PHP重定向与伪静态区别
Feb 19 PHP
php session的应用详细介绍
Mar 22 PHP
利用Laravel事件系统如何实现登录日志的记录详解
May 20 PHP
详细解读PHP中接口的应用
Aug 12 #PHP
举例讲解PHP面对对象编程的多态
Aug 12 #PHP
详解PHP中的状态模式编程
Aug 11 #PHP
简单介绍PHP的责任链编程模式
Aug 11 #PHP
PHP会话处理的10个函数
Aug 11 #PHP
PHP的Socket网络编程入门指引
Aug 11 #PHP
php实现的农历算法实例
Aug 11 #PHP
You might like
10个实用的PHP代码片段
2011/09/02 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
2012/09/25 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
THINKPHP3.2使用soap连接webservice的解决方法
2017/12/13 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
音乐播放用的的几个函数
2006/09/07 Javascript
ASP.NET jQuery 实例17 通过使用jQuery validation插件校验ListBox
2012/02/03 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
JS来动态的修改url实现对url的增删查改
2014/09/05 Javascript
浅析javascript中的DOM
2015/03/01 Javascript
JS树形菜单组件Bootstrap TreeView使用方法详解
2016/12/21 Javascript
AngularJS路由删除#符号解决的办法
2017/09/28 Javascript
javascript中call,apply,callee,caller用法实例分析
2019/07/24 Javascript
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
关于Python数据结构中字典的心得
2017/12/04 Python
Python实现按中文排序的方法示例
2018/04/25 Python
python中实现控制小数点位数的方法
2019/01/24 Python
python使用pymongo操作mongo的完整步骤
2019/04/13 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
2019/05/13 Python
python实现在cmd窗口显示彩色文字
2019/06/24 Python
关于django 1.10 CSRF验证失败的解决方法
2019/08/31 Python
使用celery和Django处理异步任务的流程分析
2020/02/19 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
使用python操作lmdb对数据读取的实例
2020/12/11 Python
html5 更新图片颜色示例代码
2014/07/29 HTML / CSS
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
个人自荐信
2013/12/05 职场文书
宝宝满月酒主持词和仪式流程
2014/03/27 职场文书
文体活动实施方案
2014/03/27 职场文书
端午节活动总结报告
2015/02/11 职场文书
稽核岗位职责范本
2015/04/13 职场文书
小学生表扬稿范文
2015/05/05 职场文书
Python 流媒体播放器的实现(基于VLC)
2021/04/28 Python
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python