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

安装Xhprof扩展

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

$ tar -zxvf xhprof-0.9.4.tgz

$ cd xhprof-0.9.4

$ cd extension/

$ phpize

$ ./configure

$ make

$ sudo make install

修改php.ini

[xhprof]

extension=xhprof.so

xhprof.output_dir=/tmp

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

对PHP进行性能分析

在XHProf扩展中,一共提供了四个函数用于对PHP进行性能分析。

xhprof_enable/xhprof_sample_enable函数用于开始XHProf性能分析,区别在于前者功能更加强大,而后者则是是以简单模式启动性能分析(简单记录了函数的调用栈信息),开销比较小。

xhprof_disable/xhprof_sample_disable函数用于停止性能分析,并返回分析的数据。

需要特别说明的函数是xhprof_enable,其他函数都是不需要提供参数的,而该函数则可以接受两个可选的参数,用于改变该工具的行为。

void xhprof_enable ([ int $flags = 0 [, array $options ]] )

flags 该参数用于为剖析结果添加额外的信息,该参数的值使用以下宏,如果需要提供多个值,使用|进行分隔。

XHPROFFLAGSNO_BUILTINS 跳过所有的内置函数

XHPROFFLAGSCPU 添加对CPU使用的分析

XHPROFFLAGSMEMORY 添加对内存使用的分析

options 数组形式提供可选参数,在此处提供ignored_functions选项需要忽略的函数

比如下面的例子,同时对内存和CPU进行分析,并且忽略对call_user_func和call_user_func_array函数的分析。

xhprof_enable(

XHPROF_FLAGS_MEMORY|XHPROF_FLAGS_CPU,

[

'ignored_functions' => [

'call_user_func',

'call_user_func_array'

]

]

);

// 这里是PHP代码,比如业务逻辑实现等要被分析的代码部分

....

$xhprofData = xhprof_disable();// $xhprofData是数组形式的分析结果

print_r($xhprofData);

注意,如果使用XHPROF_FLAGS_CPU选项对CPU占用也进行分析,在Linux环境下,会造成比较高的系统负载,因此不建议使用,而推荐只使用XHPROF_FLAGS_MEMORY,对内存的分析不会对系统造成太多负载。

形象化的查看分析结果

使用xhprof_disable完成性能分析并且获取到分析结果之后,我们通常不会直接输出结果,因为这样的结果是以数组形式组织的,看起来并不直观,幸运的是,xhprof提供了基于web的图形界面对分析结果进行查看。

在使用之前,请先确保服务器安装了graphviz工具,否则在生成监控图表的时候回出现以下错误:

failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '

这里提示找不到dot命令,所以需要先安装graphviz

$ sudo yum install graphviz

由于分析结果的查看工具是基于web的,因此,我们需要将xhprof安装包中的xhprofhtml和xhproflib目录放到服务器的web目录下,让xhprof_html目录中的内容对外可以访问。

比如我的测试服务器环境是使用vagrant搭建的Cent OS,我见过这两个目录放到/vagrant/xhprof目录下:

[vagrant@localhost xhprof]$ pwd

/vagrant/xhprof

[vagrant@localhost xhprof]$ ls

xhprof_html xhprof_lib

web服务器使用的是Nginx,因此,在Nginx的配置文件nginx.conf中的配置如下:

server {

listen 80;

server_name _;

root /vagrant;

...

web服务器的根目录是/vagrant,因此访问地址为http://localhost/xhprof/xhprof_html/index.php.

当然,配置好环境之后,我们还是获取不到分析结果的,因为我们在代码中并没有将分析结果保存到xhprof.output_dir指定的目录中。

因此,我们需要修改我们的代码,是其能够将分析结果存放到xhprof.output_dir指定的目录中。

....

$xhprofData = xhprof_disable();

require '/vagrant/xhprof/xhprof_lib/utils/xhprof_lib.php';

require '/vagrant/xhprof/xhprof_lib/utils/xhprof_runs.php';

$xhprofRuns = new XHProfRuns_Default();

$runId = $xhprofRuns->save_run($xhprofData, 'xhprof_test');

echo 'http://localhost/xhprof/xhprof_html/index.php?run=' . $runId . '&source=xhprof_test';

变量$runId是本次请求生成分析结果的id,最后我们输出了一个链接地址,使用改地址就可以看到本次请求的分析结果。

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

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

php 瓶颈,使用XHProf查找PHP性能瓶颈相关推荐

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

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

  2. mysql 瓶颈诊断_MySQL 监控、性能瓶颈排查

    监控的作用 业务/数据库服务是否可用 是否可以对外提供服务 进程在允许,但没监听网络,或者授权不正确,或者网络出故障 因此不能只监控进程启动与否,是否监听网络 最好能模拟业务逻辑进行监控 这个业务逻辑 ...

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

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

  4. 性能测试常见瓶颈分析及调优方法

    性能分析与调优如何下手,先从硬件开始,还是先从代码或数据库.从操作系统(CPU调度,内存管理,进程调度,磁盘I/O).网络.协议(HTTP, TCP/IP ),还是从应用程序代码,数据库调优,中间件配 ...

  5. 并行NFS: 打破NFS 的性能瓶颈

    这个页面包括有关pNFS的介绍-一种新出现的并行I/O标准,它是现在普遍使用的NFS标准的下一个主要扩展部分.Panasas积极推广pNFS标准和并行存储器. 事实上,pNFS的想法产生于2003年G ...

  6. linux系统安装xhprof,xhprof扩展安装与使用

    一.xhprof扩展安装步骤 xhprof是PHP的一个扩展,最好也直接安装上graphviz图形绘制工具(用于xhprof分析结果以直观的图形方式显示),废话不多说,直奔正题. 1.安装 PHP5版 ...

  7. 性能测试分析软件汇总–开源、商业全部收集

    转载地址 https://my.oschina.net/zlp5201/blog/530290 本文共包含:商业性能测试.监控.分析工具和免费.开源性能测试监控分析工具:共涉及java.php.net ...

  8. java性能保障技术_狙击P7!阿里大佬亲授“Java性能调优技术宝典”,太完整了!...

    一.前言 什么是性能调优? 性能调优其实很好理解,就是优化硬件.操作系统.应用之间的一个充分的协作,最大化的发挥出硬件的极致性能,来应对高负载的业务需求. 为什么需要性能优化? 其实说到底就是两个原因 ...

  9. c++优化工具Gprof

    原文:http://www.cnblogs.com/me115/archive/2013/06/05/3117967.html 内容目录: 1 Gprof 2. gprof使用步骤 1.初始化大对象耗 ...

最新文章

  1. 在Servlet中使用开源fileupload包实现文件上传功能
  2. Mvc项目解决方案分析
  3. sqoop实现Mysql、Oracle与hdfs之间数据的互导
  4. 如何将学术经历整合为求职简历?
  5. Zabbix添加网络设备
  6. BAT程序员总结的力扣刷题指南,已经在Github了!!刷题顺序,优质题解一网打尽!
  7. 【文本挖掘】关键词提取
  8. analyze 命令
  9. C++基础知识(上)
  10. echarts配合google地图,并自定义google地图的样式
  11. 平开式窗帘有哪些选购要点?-好佳居窗帘十大品牌
  12. Thymeleaf模板(全程案例详解)
  13. 卡片消除游戏 java版(代码+讲解)
  14. 液体倒进电脑了怎么办
  15. hyperparameters 超参数
  16. matlab中在图像上划线 画圈的方法
  17. java课程设计家庭财务管理系统_家庭财务管理系统设计方案与实现.doc
  18. Dialog弹出对话框使用
  19. 【自动化测试工程师】成为自动化测试的7种技能
  20. NS3系列—6———NS3无线资料

热门文章

  1. php 两个单词 正则表达式字符前_PHP正则表达式核心技术完全详解 第3节
  2. 海外仓ERP系统功能怎么样?
  3. mysql 主从 锁库_mysql 5.7.21 主从集群恢复GTID方式(不锁库)
  4. 测试环境搭建mysql数据库_软件测试环境的搭建系列:[2] MySQL数据库的安装
  5. Leetcode每日一题:3.无重复字符的最长子串
  6. python, numpy
  7. 2019年的流水账和总结
  8. CDH 5.15.2 离线安装
  9. 一文了解Innodb中的锁
  10. 直击苹果 ARKit 技术