安装xhprof扩展

wget http://pecl.php.net/get/xhprof-0.9.4.tgz

tar zxf xhprof-0.9.4.tgz

cd xhprof-0.9.4/extension/

sudo phpize

./configure

sudo make

sudo make install

cd ../

配置php.ini

[xhprof]

extension=xhprof.so

xhprof.output_dir=/tmp

注:xhprof已经很久没有更新过了,截至目前还不支持php7,php7可以使用 https://github.com/phacility/...。

配置xhprof环境

需要把xhprof压缩包里的两个目录复制到指定目录(假设定义到 /work/xhprof/):

mkdir /work/xhprof/

cp -a xhprof_html/ /work/xhprof/

cp -a xhprof_lib/ /work/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();

}

include_once "/work/xhprof/xhprof_lib/utils/xhprof_lib.php";

include_once "/work/xhprof/xhprof_lib/utils/xhprof_runs.php";

$xhprof_runs = new XHProfRuns_Default();

$run_id = $xhprof_runs->save_run($xhprof_data, 'xhprof');

});

代码解析:

$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_enable和xhprof_disable是成对出现的,一个是代码运行最前面,一个是最后面。中间是要分析的代码。

经过上面的配置后,我们后续请求项目的接口,xhprof就会分析请求过程中的CPU、内存、耗时等内容。日志保存在xhprof.output_dir目录。

配置web

配置好了,怎么查看日志呢?我们可以搭建一个简单的web server:

xhprof.test.com.conf

server {

listen 80;

server_name xhprof.test.com;

root /work/xhprof/xhprof_html;

index index.html index.php;

location ~ \.php$ {

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

}

}

然后配置虚拟主机xhprof.test.com。重启nginx,打开 xhprof.test.com就可以看到效果了:

默认的UI里列出了:

funciton name : 函数名

calls: 调用次数

Incl. Wall Time (microsec): 函数运行时间(包括子函数)

IWall%:函数运行时间(包括子函数)占比

Excl. Wall Time(microsec):函数运行时间(不包括子函数)

EWall%:函数运行时间(不包括子函数)

在web中还可以看到 [View Full Callgraph] 链接,点击后可以绘制出一张可视化的性能分析图,如果点击后报错的话,可能是缺少依赖graphviz。graphviz是一个绘制图形的工具,可以更为直观的让你查看性能的瓶颈。如果需要可以安装:

yum install -y libpng

yum install -y graphviz

效果:

非侵入式引入xhprof

前面我们是通过在项目入口文件添加代码实现了分析的功能。更优雅的方式是新建一个额外的文件 xhprof.inc.php,保存在/work/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();

}

include_once "/work/xhprof/xhprof_lib/utils/xhprof_lib.php";

include_once "/work/xhprof/xhprof_lib/utils/xhprof_runs.php";

$xhprof_runs = new XHProfRuns_Default();

$run_id = $xhprof_runs->save_run($xhprof_data, 'xhprof');

});

利用PHP的自动加载功能,在执行代码前注入此文件,编辑php.ini:

auto_prepend_file = /work/xhprof/xhprof.inc.php

然后重启PHP服务。这样所有使用该php环境的都会生效。

或者写到指定项目的nginx配置里也行:

jifen.cc.conf

location ~ \.php$ {

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_param PHP_VALUE "auto_prepend_file=/work/xhprof/xhprof.inc.php";

include fastcgi_params;

}

然后重启nginx服务。这样仅该项目生效。

通过 auto_prepend_file 和 auto_append_file包含的文件在此模式下会被解析,但有些限制,例如函数必须在被调用之前定义。

修改采样频率

默认情况下,xhprof每次都会运行,线上环境如果这么设置,会对性能有影响。

xhprof.inc.php

$profiling = !(mt_rand()%9);

if($profiling) xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);

register_shutdown_function(function() use($profiling) {

if($profiling){

$xhprof_data = xhprof_disable();

if (function_exists('fastcgi_finish_request')){

fastcgi_finish_request();

}

include_once "/work/xhprof/xhprof_lib/utils/xhprof_lib.php";

include_once "/work/xhprof/xhprof_lib/utils/xhprof_runs.php";

$xhprof_runs = new XHProfRuns_Default();

$xhprof_runs->save_run($xhprof_data, 'xhprof');

}

});

总结

本篇文章里,我们介绍了如何基于xhprof扩展来分析PHP性能,并记录到日志里,最后使用xhprof扩展自带的UI在web里展示出来。主要知识点:

安装xhprof扩展

在应用里注入xhprof

基于nginx展示分析结果

参考

1、Xhprof 的配置和使用方法 - 简书

https://www.jianshu.com/p/38e...

2、使用XHProf查找PHP性能瓶颈 - 程序猿成长计划 - SegmentFault 思否

https://segmentfault.com/a/11...

3、PHP性能追踪及分析工具xhprof的安装与使用 - 马新才的技术博客 - SegmentFault 思否

https://segmentfault.com/a/11...

4、Tideways和xhgui打造PHP非侵入式监控平台 | 我是大熊

http://blog.it2048.cn/article...

防盗版声明:本文系原创文章,原发布于公众号飞鸿影的博客(fhyblog)及博客园,转载需作者同意。

php生产环境性能瓶颈分析,使用XHProf分析PHP性能瓶颈(一)相关推荐

  1. 生产环境 JVM 内存溢出案例分析

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:blog.csdn.net/prestigeding ...

  2. 生产环境JVM内存溢出案例分析

    如果我们所在公司的业务量比较大,在生产环境经常会出现JVM内存溢出的现象,那我们该如何快速响应,快速定位,快速恢复问题呢? 本文将通过一个线上环境JVM内存溢出的案例向大家介绍一下处理思路与分析方法. ...

  3. 生产环境JVM内存溢出案例分析!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:Nginx 为什么快到根本停不下来? 个人原创100W+访问量博客:点击前往,查看更多 来源:blog.csdn ...

  4. java生产问题快速定位_生产环境如何快速跟踪、分析、定位问题-Java

    我相信做技术的都会遇到过这样的问题,生产环境服务遇到宕机的情况下如何去分析问题?比如说JVM内存爆掉.CPU持续高位运行.线程被夯住或线程deadlocks,面对这样的问题,如何在生产环境第一时间跟踪 ...

  5. 生产环境不同问题定位及分析

    在实际的程序运行中,有很多问题只有在线上或者预发布环境才会出现,而线上又不能调试代码,所以线上问题定位只能看日志,系统状态和dump线程. 一. 生产环境服务器变慢,诊断思路和性能评估 系统日志:/v ...

  6. php接口耗时分析工具,php性能分析工具xhprof分析

    facebook,做为世界上最大的php应用网站,为php贡献出了hhvm xhprof等优秀开源工具,其中xhprof已成为很多phper调试php性能瓶颈的利器.本文作者将从xhprof源码出发, ...

  7. 项目实战典型案例10——对生产环境以及生产数据的敬畏之心

    对生产环境以及生产数据的敬畏之心 一:背景介绍 总结 升华 一:背景介绍 本篇博客是对项目开发中出现的对生产环境以及生产数据的敬畏之心行的总结并进行的改进.目的是将经历转变为自己的经验.通过博客的方式 ...

  8. 使用XHProf分析PHP性能瓶颈(二)

    上一篇文章里,我们介绍了如何基于xhprof扩展来分析PHP性能,并记录到日志里,最后使用xhprof扩展自带的UI在web里展示出来.本篇文章将讲述2个知识点: 使用xhgui代替xhprof的默认 ...

  9. 四步法分析定位生产环境下MySQL上千条SQL中的问题所在

    第一步:通过以下两种方式之一来打开慢查询功能 (1)方式一:通过修改mysql的my.cnf文件 如果是5.0或5.1等版本需要增加以下选项: log-slow-queries="mysql ...

  10. UAT环境正常,上线生产环境后访问不到数据的原因分析及问题解决

    本人研发小白一名,时间:2017年12月21(周四),坐标:上海.项目上线,测试环境正常,上UAT环境后访问不到数据,于是开始步步分析,细细琢磨,最终成功上UAT,但影响了上生产环境的时间,造成项目延 ...

最新文章

  1. 深度解析 | 大数据面前,统计学的价值在哪里?
  2. python编程财务应用_Python笔记 财务小白的 day6 python编程基础(4)
  3. Redis 写磁盘出错 Cannot allocate memory
  4. 关于@Mapper注解的几个问题
  5. mysql oracle 锁机制_Mysql锁机制
  6. div内容居中、隐藏及按钮隐藏写法
  7. Tabio – 轻松,高效的管理 Chrome 标签页
  8. python代码编写_高质量Python代码编写的5个优化技巧
  9. 微信小程序购物车功能实现(干货满满)
  10. Oracle密码过期
  11. 灭霸一个响指,开源众包出现在开源中国的社区APP里,一键接单从此无忧。
  12. Express全系列教程之(六):cookie的使用
  13. linux phy fixed-link
  14. 【Python异常处理】:如何处理异常报错?
  15. 如何理解类与对象、继承
  16. 让U盘变成密码启动锁方法
  17. SetWindowPos 函数的含义及用法
  18. Android录音并进行本地转码为MP3
  19. Virtual script not found, may missing <script lang=“ts“> / “allowJs“: true / jsconfig.json.volar
  20. 机器学习生物医学图像处理方向研究前景如何?

热门文章

  1. 关于LibFetion(小飞信)被禁止登陆的思考
  2. c语言程序设计马秀丽课后题答案,c语言程序设计课后题答案马秀丽
  3. 量子计算机旋转硬币,量子行走漫谈
  4. 河北师范大学计算机专业保研率,12所师范大学2018-2020年保研率对比!附9所师范大学2021保研率...
  5. 病毒肆虐,宅在家里的时候,作为企业经营者的我在想些什么
  6. RHCE考试第一天之学习安排计划
  7. 怎样把pdf转换成word-多语言ocr支持
  8. 百度编辑器Ueditor 多图上传出现部分照片尺寸不压缩的问题解决
  9. TIGER(泰格)胡东国老师带单有盈利吗?平台正规吗?
  10. Python编写工资计算器