使用XHProf查找PHP性能瓶颈
XHProf是facebook 开发的一个测试php性能的扩展,本文记录了在PHP应用中使用XHProf对PHP进行性能优化,查找性能瓶颈的方法。
一、安装Xhprof扩展
- //github上下载https://github.com/facebook/xhprof
1 unzip xhprof-master.zip- cd xhprof-master/extension/
- /usr/local/php/bin/phpize
- ./configure --with-php-config=/usr/local/php/bin/php-config --enable-xhprof
- make && make install
二、修改php.ini
- [xhprof]
- extension=xhprof.so
- xhprof.output_dir=/tmp
配置中xhprof.output_dir
指定了生成的profile文件存储的位置,我们将其指定为/tmp。
三、将相关文件移动项目中
- //xhprof下载压缩包中的xhprof_html和xhprof_lib
- cp -r xhprof-master/xhprof_html /usr/local/nginx/html/xhprof/
- cp -r xhprof-master/xhprof_lib /usr/local/nginx/html/xhprof/
配置一个域名,浏览器可以访问到 http://will.com/xhprof/xhprof_html/index.php
- server{
- listen ;
- server_name will.com;
- location / {
- root /usr/local/nginx/html;
- index index.html;
- }
- location ~ \.php$ {
- root html;
- fastcgi_pass 127.0.0.1:;
- fastcgi_index index.php;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- include fastcgi_params;
- }
- }
四、安装graphivz
- //需要安装graphviz否则查看性能图片时候会报
failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '
- yum -y install graphviz
五、编写测试文件
- //入口文件的开始位置
- xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
- 业务逻辑...
- //业务逻辑结束后
- $xhprof_data = xhprof_disable();
- include_once "/usr/local/nginx/html/xhprof/xhprof_lib/utils/xhprof_lib.php";
- include_once "/usr/local/nginx/html/xhprof/xhprof_lib/utils/xhprof_runs.php";
- $objXhprofRun = new XHProfRuns_Default();//数据会保存在php.ini中xhprof.output_dir设置的目录去中
- $run_id = $objXhprofRun->save_run($xhprof_data, "test");
完整代码示例(随机满减红包demo)
- <?php
- xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
- function show($info)
- {
- echo "<pre>";
- print_r($info);
- }
- //不作数据校验
- $rules = array(
- 2=>array('min'=>1, 'max'=>10, 'chance'=>30),//金额:分 概率:百分之(默认为100%,不足100%按第一档计算)
- array('min'=>11, 'max'=>25, 'chance'=>60),
- array('min'=>26, 'max'=>50, 'chance'=>10),
- array('min'=>50, 'max'=>80, 'chance'=>0),
- array('min'=>80, 'max'=>100, 'chance'=>0),
- );
- $total_money = 10000;//红包总金额
- $res = array();
- while($total_money>0)
- {
- $index = getLevel($rules);
- $money = setMoney($rules, $index);
- if ($money > $total_money)//金额不足
- {
- $money = $total_money;
- $total_money = 0;
- } else {
- $total_money -= $money;
- }
- $res[] = ($index+1)."---".$money;
- }
- echo show($res);
- echo $total_money . "<br/>";
- //1.先确定档次
- function getLevel($rules)
- {
- $level = array();
- $chance = 0;
- foreach($rules as $k=>$v)
- {
- if ($v['chance']>0)
- {
- $chance += $v['chance']*100;//扩大100倍
- $level[$k] = $chance;
- }
- }
- $index = 0;
- $rand_num = mt_rand(1, 10000);
- foreach($level as $k=>$v)
- {
- if ($rand_num <= $v)
- {
- $index = $k;
- break;
- }
- }
- return $index;
- }
- //2.确定档次之后,再确定金额
- function setMoney($rules, $index)
- {
- $money = mt_rand($rules[$index]['min']*10000, $rules[$index]['max']*10000)/10000;
- $money = ceil($money);
- $money > 1 && $money = $money -1;//防止出现免单情况
- return $money;
- }
- $xhprof_data = xhprof_disable();
- include_once "/usr/local/nginx/html/xhprof/xhprof_lib/utils/xhprof_lib.php";
- include_once "/usr/local/nginx/html/xhprof/xhprof_lib/utils/xhprof_runs.php";
- $objXhprofRun = new XHProfRuns_Default();//数据会保存在php.ini中xhprof.output_dir设置的目录去中
- $run_id = $objXhprofRun->save_run($xhprof_data, "test");
- 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性能瓶颈的更多相关文章
- php:使用XHProf查找PHP性能瓶颈
https://www.cnblogs.com/casatwy/archive/2013/01/17/2865241.html XHProf是facebook 开发的一个测试php性能的扩展,本文记录 ...
- 使用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 ...
- 使用XHProf分析PHP性能瓶颈(二)
上一篇文章里,我们介绍了如何基于xhprof扩展来分析PHP性能,并记录到日志里,最后使用xhprof扩展自带的UI在web里展示出来.本篇文章将讲述2个知识点: 使用xhgui代替xhprof的默认 ...
- 安装XHProf分析PHP性能瓶颈(原创)
废话不多说,直接上代码 ,手动滑稽.o(╯□╰)o 如果已解决您的问题,请在文章底部点击下关注,非常感谢. 下面是LINUX命令行 $ wget http://pecl.php.net/get/x ...
- xhprof扩展安装与使用
目录 一.xhprof扩展安装步骤 二.xhprof的使用 总结 参考资料 一.xhprof扩展安装步骤 xhprof是PHP的一个扩展,最好也直接安装上graphviz图形绘制工具(用于xhprof ...
- Java研发岗位面试归类B(附答案)
本文承接上文:Java研发岗位面试归类A(附答案): http://www.cnblogs.com/wp5719/p/5870243.html 答案自己网上找的,如有纰漏或错误,烦请指教. 七.数据库 ...
- 2016java技术岗面试题
一.Java基础 1. String类为什么是final的. 2. HashMap的源码,实现原理,底层结构. 3. 说说你知道的几个Java集合类:list.set.queue.map实现类咯... ...
- 2015年Java开发岗位面试题归类
一.Java基础 1. String类为什么是final的. 2. HashMap的源码,实现原理,底层结构. 3. 说说你知道的几个Java集合类:list.set.queue.map实现类咯... ...
- 高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化
高性能Linux服务器 第10章 基于Linux服务器的性能分析与优化 作为一名Linux系统管理员,最主要的工作是优化系统配置,使应用在系统上以最优的状态运行.但硬件问题.软件问题.网络环境等 ...
随机推荐
- Maven中基于POM.xml的Profile来动态切换配置信息
[转载:https://blog.csdn.net/blueheart20/article/details/52838093] 1. Maven中的profile设置 Maven是目前主流的项目代码结 ...
- 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: ...
- Netty客户端发送消息并同步获取结果
客户端发送消息并同步获取结果,其实是违背Netty的设计原则的,但是有时候不得不这么做的话,那么建议进行如下的设计: 比如我们的具体用法如下: NettyRequest request = new N ...
- Linux虚机安装配置Tomcat
d第一步:下载Tomcat包,网址http://tomcat.apache.org/ 选择tar.gz包下载,并传到虚机中 第二步:解压下载好的Tomcat包 命令:tar -zxvf apache- ...
- HTML的块级元素和行内元素
行内元素一般是内容的容器,而块级元素一般是其他容器的容器.一般情况下,行内元素只能包含内容或者其它行内元素,宽度和长度依据内容而定,不可以设置,可以和其它元素和平共处于一行:而块级元素可以包含行内元素 ...
- Android Studio之SVN打分支、切换分支及合并分支
1.打分支: 右击项目--Subversion--Branch or Tag 点击OK,分支就创建成功了,接下来我们切换到分支v2 2.切换分支: 右击项目--Subversion--Update D ...
- 《深入分析Java web技术内幕》读书笔记(一)
1.什么时网站 网站就是利用Html工具制作用于展示特定内容的网页集合,网站也是一种软件. 网站的开发过程需要考虑其完整性.目的性.扩展性和安全性. 2.C/S架构跟B/S架构 C/S架构:客户端和服 ...
- C# [WIN32] [API] Global Hook
NativeMethods.cs: using System; using System.Runtime.InteropServices; namespace GlobalHook { interna ...
- react系列笔记:第一记-redux
前言: 目前公司使用dva,对于前不久还是使用原生js的我来说,花了差不多一两周时间,基本掌握如何使用.虽然对于react有一点点基础,但很多地方未深入,很多概念也很模糊,故从本文开始,记录一下系统的 ...
- json之dump和dumps,load和loads
import json#反序列化f = open('test', 'rb')data = json.load(f) #相当于下句# data = json.loads(f.read()) #序列化f ...