XHProf是facebook 开发的一个测试php性能的扩展,本文记录了在PHP应用中使用XHProf对PHP进行性能优化,查找性能瓶颈的方法。

一、安装Xhprof扩展

  1. //github上下载https://github.com/facebook/xhprof
    1 unzip xhprof-master.zip
  2. cd xhprof-master/extension/
  3. /usr/local/php/bin/phpize
  4. ./configure --with-php-config=/usr/local/php/bin/php-config --enable-xhprof
  5. make && make install

二、修改php.ini

  1. [xhprof]
  2. extension=xhprof.so
  3. xhprof.output_dir=/tmp

配置中xhprof.output_dir指定了生成的profile文件存储的位置,我们将其指定为/tmp。

三、将相关文件移动项目中

  1. //xhprof下载压缩包中的xhprof_html和xhprof_lib
  2. cp -r xhprof-master/xhprof_html /usr/local/nginx/html/xhprof/
  3. cp -r xhprof-master/xhprof_lib /usr/local/nginx/html/xhprof/

配置一个域名,浏览器可以访问到 http://will.com/xhprof/xhprof_html/index.php

  1. server{
  2. listen ;
  3. server_name will.com;
  4. location / {
  5. root /usr/local/nginx/html;
  6. index index.html;
  7. }
  8. location ~ \.php$ {
  9. root html;
  10. fastcgi_pass 127.0.0.1:;
  11. fastcgi_index index.php;
  12. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  13. include fastcgi_params;
  14. }
  15. }

四、安装graphivz

  1.  
  1. //需要安装graphviz否则查看性能图片时候会报failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '
  1. yum -y install graphviz

五、编写测试文件

  1. //入口文件的开始位置
  2. xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
  3.  
  4. 业务逻辑...
  5.  
  6. //业务逻辑结束后
  7. $xhprof_data = xhprof_disable();
  8. include_once "/usr/local/nginx/html/xhprof/xhprof_lib/utils/xhprof_lib.php";
  9. include_once "/usr/local/nginx/html/xhprof/xhprof_lib/utils/xhprof_runs.php";
  10. $objXhprofRun = new XHProfRuns_Default();//数据会保存在php.ini中xhprof.output_dir设置的目录去中
  11. $run_id = $objXhprofRun->save_run($xhprof_data, "test");

完整代码示例(随机满减红包demo)

  1. <?php
  2. xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
  3.  
  4. function show($info)
  5. {
  6. echo "<pre>";
  7. print_r($info);
  8. }
  9.  
  10. //不作数据校验
  11. $rules = array(
  12. 2=>array('min'=>1, 'max'=>10, 'chance'=>30),//金额:分 概率:百分之(默认为100%,不足100%按第一档计算)
  13. array('min'=>11, 'max'=>25, 'chance'=>60),
  14. array('min'=>26, 'max'=>50, 'chance'=>10),
  15. array('min'=>50, 'max'=>80, 'chance'=>0),
  16. array('min'=>80, 'max'=>100, 'chance'=>0),
  17. );
  18.  
  19. $total_money = 10000;//红包总金额
  20. $res = array();
  21. while($total_money>0)
  22. {
  23. $index = getLevel($rules);
  24.  
  25. $money = setMoney($rules, $index);
  26. if ($money > $total_money)//金额不足
  27. {
  28. $money = $total_money;
  29. $total_money = 0;
  30. } else {
  31. $total_money -= $money;
  32. }
  33. $res[] = ($index+1)."---".$money;
  34. }
  35. echo show($res);
  36. echo $total_money . "<br/>";
  37.  
  38. //1.先确定档次
  39. function getLevel($rules)
  40. {
  41. $level = array();
  42. $chance = 0;
  43. foreach($rules as $k=>$v)
  44. {
  45. if ($v['chance']>0)
  46. {
  47. $chance += $v['chance']*100;//扩大100倍
  48. $level[$k] = $chance;
  49. }
  50. }
  51. $index = 0;
  52. $rand_num = mt_rand(1, 10000);
  53. foreach($level as $k=>$v)
  54. {
  55. if ($rand_num <= $v)
  56. {
  57. $index = $k;
  58. break;
  59. }
  60. }
  61. return $index;
  62. }
  63.  
  64. //2.确定档次之后,再确定金额
  65. function setMoney($rules, $index)
  66. {
  67. $money = mt_rand($rules[$index]['min']*10000, $rules[$index]['max']*10000)/10000;
  68. $money = ceil($money);
  69. $money > 1 && $money = $money -1;//防止出现免单情况
  70. return $money;
  71. }
  72.  
  73. $xhprof_data = xhprof_disable();
  74. include_once "/usr/local/nginx/html/xhprof/xhprof_lib/utils/xhprof_lib.php";
  75. include_once "/usr/local/nginx/html/xhprof/xhprof_lib/utils/xhprof_runs.php";
  76. $objXhprofRun = new XHProfRuns_Default();//数据会保存在php.ini中xhprof.output_dir设置的目录去中
  77. $run_id = $objXhprofRun->save_run($xhprof_data, "test");
  78.  
  79. echo "http://will.com/xhprof/xhprof_html/index.php?run=$run_id&source=test";//变量$runId是本次请求生成分析结果的id,最后我们输出了一个链接地址,使用改地址就可以看到本次请求的分析结果。

六、查看分析结果

先运行业务代码;

然后浏览器打开 http://will.com/xhprof/xhprof_html/index.php, 点击最后一次生成xhprof文件

注意到中间的View Full Callgraph链接,通过该链接我们可以看到图形化的分析结果

图中红色的部分为性能比较低,耗时比较长的部分,我们可以根据根据哪些函数被标记为红色对系统的代码进行优化

另外附上, xhprof报告字段含义:

Function Name:方法名称。

Calls:方法被调用的次数。

Calls%:方法调用次数在同级方法总数调用次数中所占的百分比。

Incl.Wall Time(microsec):方法执行花费的时间,包括子方法的执行时间。(单位:微秒)

IWall%:方法执行花费的时间百分比。

Excl. Wall Time(microsec):方法本身执行花费的时间,不包括子方法的执行时间。(单位:微秒)

EWall%:方法本身执行花费的时间百分比。

Incl. CPU(microsecs):方法执行花费的CPU时间,包括子方法的执行时间。(单位:微秒)

ICpu%:方法执行花费的CPU时间百分比。

Excl. CPU(microsec):方法本身执行花费的CPU时间,不包括子方法的执行时间。(单位:微秒)

ECPU%:方法本身执行花费的CPU时间百分比。

Incl.MemUse(bytes):方法执行占用的内存,包括子方法执行占用的内存。(单位:字节)

IMemUse%:方法执行占用的内存百分比。

Excl.MemUse(bytes):方法本身执行占用的内存,不包括子方法执行占用的内存。(单位:字节)

EMemUse%:方法本身执行占用的内存百分比。

Incl.PeakMemUse(bytes):Incl.MemUse峰值。(单位:字节)

IPeakMemUse%:Incl.MemUse峰值百分比。

Excl.PeakMemUse(bytes):Excl.MemUse峰值。单位:(字节)

EPeakMemUse%:Excl.MemUse峰值百分比。

使用XHProf查找PHP性能瓶颈的更多相关文章

  1. php:使用XHProf查找PHP性能瓶颈

    https://www.cnblogs.com/casatwy/archive/2013/01/17/2865241.html XHProf是facebook 开发的一个测试php性能的扩展,本文记录 ...

  2. 使用XHProf分析PHP性能瓶颈(一)

    安装xhprof扩展 wget http://pecl.php.net/get/xhprof-0.9.4.tgz tar zxf xhprof-0.9.4.tgz cd xhprof-0.9.4/ex ...

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

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

  4. 安装XHProf分析PHP性能瓶颈(原创)

    废话不多说,直接上代码 ,手动滑稽.o(╯□╰)o   如果已解决您的问题,请在文章底部点击下关注,非常感谢. 下面是LINUX命令行 $ wget http://pecl.php.net/get/x ...

  5. xhprof扩展安装与使用

    目录 一.xhprof扩展安装步骤 二.xhprof的使用 总结 参考资料 一.xhprof扩展安装步骤 xhprof是PHP的一个扩展,最好也直接安装上graphviz图形绘制工具(用于xhprof ...

  6. Java研发岗位面试归类B(附答案)

    本文承接上文:Java研发岗位面试归类A(附答案): http://www.cnblogs.com/wp5719/p/5870243.html 答案自己网上找的,如有纰漏或错误,烦请指教. 七.数据库 ...

  7. 2016java技术岗面试题

    一.Java基础 1. String类为什么是final的. 2. HashMap的源码,实现原理,底层结构. 3. 说说你知道的几个Java集合类:list.set.queue.map实现类咯... ...

  8. 2015年Java开发岗位面试题归类

    一.Java基础 1. String类为什么是final的. 2. HashMap的源码,实现原理,底层结构. 3. 说说你知道的几个Java集合类:list.set.queue.map实现类咯... ...

  9. 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化

    高性能Linux服务器 第10章    基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...

随机推荐

  1. Maven中基于POM.xml的Profile来动态切换配置信息

    [转载:https://blog.csdn.net/blueheart20/article/details/52838093] 1. Maven中的profile设置 Maven是目前主流的项目代码结 ...

  2. Jenkins自动构建gitlab项目(jenkins+maven+giltlab+tomcat)

    环境准备: System:CentOS 7.3 (最小化安装) JDK: 8u161 (1.8_161) tomcat: 8.5.29 Jenkins: Jenkins 2.107.1 Gitlab: ...

  3. Netty客户端发送消息并同步获取结果

    客户端发送消息并同步获取结果,其实是违背Netty的设计原则的,但是有时候不得不这么做的话,那么建议进行如下的设计: 比如我们的具体用法如下: NettyRequest request = new N ...

  4. Linux虚机安装配置Tomcat

    d第一步:下载Tomcat包,网址http://tomcat.apache.org/ 选择tar.gz包下载,并传到虚机中 第二步:解压下载好的Tomcat包 命令:tar -zxvf apache- ...

  5. HTML的块级元素和行内元素

    行内元素一般是内容的容器,而块级元素一般是其他容器的容器.一般情况下,行内元素只能包含内容或者其它行内元素,宽度和长度依据内容而定,不可以设置,可以和其它元素和平共处于一行:而块级元素可以包含行内元素 ...

  6. Android Studio之SVN打分支、切换分支及合并分支

    1.打分支: 右击项目--Subversion--Branch or Tag 点击OK,分支就创建成功了,接下来我们切换到分支v2 2.切换分支: 右击项目--Subversion--Update D ...

  7. 《深入分析Java web技术内幕》读书笔记(一)

    1.什么时网站 网站就是利用Html工具制作用于展示特定内容的网页集合,网站也是一种软件. 网站的开发过程需要考虑其完整性.目的性.扩展性和安全性. 2.C/S架构跟B/S架构 C/S架构:客户端和服 ...

  8. C# [WIN32] [API] Global Hook

    NativeMethods.cs: using System; using System.Runtime.InteropServices; namespace GlobalHook { interna ...

  9. react系列笔记:第一记-redux

    前言: 目前公司使用dva,对于前不久还是使用原生js的我来说,花了差不多一两周时间,基本掌握如何使用.虽然对于react有一点点基础,但很多地方未深入,很多概念也很模糊,故从本文开始,记录一下系统的 ...

  10. json之dump和dumps,load和loads

    import json#反序列化f = open('test', 'rb')data = json.load(f) #相当于下句# data = json.loads(f.read()) #序列化f ...