一、xhprof扩展安装步骤

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

1、安装

  • PHP5版本的安装
  1. wget http://pecl.php.net/get/xhprof-0.9.4.tgz
  2. tar -zxvf xhprof-0.9.4.tgz
  3. cd xhprof-0.9.4
  4. cd extension/
  5. phpize
  6. ./configure
  7. make
  8. make install
  • PHP7版本的安装

下载源码包xhprofhttps://github.com/rustjason/xhprof/tree/php7

  1. unzip xhprof-php7.zip
  2. cd xhprof-php7/extension/
  3. phpize
  4. ./configure --with-php-config=/usr/local/php/bin/php-config
  5. make
  6. make install

2、修改php.ini配置文件

在php.ini配置文件中追加下面配置,并创建目录/home/wwwroot/default/xhprof_data

  1. [xhprof]
  2. extension = xhprof.so
  3. // xhprof分析结果文件存放根目录
  4. xhprof.output_dir = /home/wwwroot/default/xhprof_data

3、添加一个环境变量XHPROF_ROOT_PATH

为了后期每个项目都能使用xhprof来进行性能分析,建议给PHP加一个环境变量,这样之后,在任何项目代码里都可以很方便的调用xhprof来分析性能瓶颈,请执行如下操作:

  1. vim /usr/local/php/etc/php-fpm.conf
  2. env[XHPROF_ROOT_PATH]=/usr/local/php/include/xhprof/

4、将xhprof核心源代码复制到上述XHPROF_ROOT_PATH环境变量所指定的目录下

  1. cp -r xhprof_lib /usr/local/php/include/xhprof/xhprof_lib

5、将下面两个目录复制到xhprof_data的同级目录下(最好都放到web根目录下)

查看分析结果文件有用

  1. //执行
  2. cp -r xhprof_html /home/wwwroot/default/xhprof_html
  3. cp -r xhprof_lib /home/wwwroot/default/xhprof_lib
  4. //改变xhprof_data目录拥有者,为了浏览器访问时能在xhprof_data目录下写入文件
  5. chown -R www:www xhprof_data

6、访问xhprof根目录

配置demo.com域名根目录为/home/wwwroot/default/,则可访问如下链接查看xhprof结果分析根目录http://demo.com/xhprof_data/,如下图所示:

7、形象化的查看分析结果

安装图形绘制工具,后面的分析结果可以通过该工具以图形显示,更直观

执行安装命令:yum install graphviz

二、xhprof的使用

1、xhprof性能分析小demo

下面写的三种方式实现阶乘的代码

  1. <?php
  2. xhprof_enable(XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
  3. $n = 5;
  4. echo jc($n);
  5. echo '<br>';
  6. echo jc($n);
  7. echo '<br>';
  8. echo jc($n);
  9. echo '<br>';
  10. function jc($n){
  11. if($n == 1){
  12. return 1;
  13. }
  14. return $n * jc($n-1);
  15. }
  16. function jc2($n){
  17. $m = 1;
  18. for($i=1; $i<=$n; $i++){
  19. $m = $m * $i;
  20. }
  21. return $m;
  22. }
  23. function jc3($n){
  24. $arr = [];
  25. $arr[1] = 1;
  26. for($i = 2; $i<=$n; $i++){
  27. $arr[$i] = $i * $arr[$i-1];
  28. }
  29. return $arr[$n];
  30. }
  31. $data = xhprof_disable();
  32. //$_SERVER['XHPROF_ROOT_PATH'] 这就是第三步添加的那个环境变量
  33. include_once $_SERVER['XHPROF_ROOT_PATH'] . "xhprof_lib/utils/xhprof_lib.php";
  34. include_once $_SERVER['XHPROF_ROOT_PATH'] . "xhprof_lib/utils/xhprof_runs.php";
  35. $x = new XHProfRuns_Default();
  36. //拼接文件名
  37. $xhprofFilename = date('Ymd_His');
  38. //print_r($data);die;//此处的打印数据看起来非常不直观,所以需要安装yum install graphviz 图形化界面显示,更直观
  39. $x->save_run($data, $xhprofFilename);

上述小demo执行后,会在xhprof_data目录下生成一个分析结果保存文件,网页端访问结果文件,如下图:

当我在点[View Full Callgraph]查看图形分析界面时,问题出现了,如下图:



好在网上查到原因是,php配置文件中有个disable_functions禁用函数列表,把里面的proc_open去掉即可。

图形分析结果显示如下

2、实际项目中该如何引入xhprof

请参考如下截图所示引入思路(在项目控制器基类构造方法和析构方法里做手脚),思路技巧仅供学习参考,如下图:



下面是我在项目(以Yii2为框架)下引入xhprof代码一览

  1. <?php
  2. namespace backend\component;
  3. use Yii;
  4. use common\component\baseController;
  5. class backendBaseController extends baseController
  6. {
  7. public $layout = "/content";
  8. public $enableCsrfValidation = false;
  9. public static $profiling = 0;
  10. public function init(){
  11. parent::init();
  12. self::$profiling = 1;// !(mt_rand() % 9);
  13. if (self::$profiling) {
  14. xhprof_enable(XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
  15. }
  16. }
  17. public function __destruct()
  18. {
  19. if(self::$profiling){
  20. $data = xhprof_disable();
  21. //$_SERVER['XHPROF_ROOT_PATH'] 该环境变量由第3步得来
  22. include_once $_SERVER['XHPROF_ROOT_PATH'] . "/xhprof_lib/utils/xhprof_lib.php";
  23. include_once $_SERVER['XHPROF_ROOT_PATH'] . "/xhprof_lib/utils/xhprof_runs.php";
  24. $x = new XHProfRuns_Default();
  25. //当前路由
  26. $routeName = Yii::$app->requestedRoute;
  27. //路由为空,则说明是首页
  28. if (empty($routeName)){
  29. $routeName = Yii::$app->defaultRoute;
  30. }
  31. //拼接xhprof分析结果保存文件名
  32. $xhprofFilename = str_replace('/', '_', $routeName).'_'.date('Ymd_His');
  33. $x->save_run($data, $xhprofFilename);
  34. }
  35. }
  36. }

总结

xhprof是一个分析PHP代码性能瓶颈,提高PHP代码效率的有利工具,通过xhprof,可以看到代码慢在哪里,哪里还有优化的空间等等。

最后分享一个关于xhprof不错的资料 ipc2015-xhprof.pdf 下载链接:https://pan.baidu.com/s/1EPuKunXlI1gvmtLICHyCxw 密码:11p0

参考资料

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

2.PHP性能分析工具 xhprof

3.xhprof安装了graphviz还报错failed to execute cmd " dot -Tpng"

xhprof扩展安装与使用的更多相关文章

  1. PHP5.4安装xhprof扩展[不要去pecl下载]

    HP5.3或之前版本可以去pecl(http://pecl.php.net)下载xhprof扩展安装. 但pecl上的版本不支持PHP5.4 可以到github上的xhprof库中下载:https:/ ...

  2. php性能分析工具 - xhprof的安装使用

    一.前言 有用的东西还是记录下来吧,也方便以后的查询:这次记录一下xhprof的安装使用: xhprof是facebook开源出来的一个php轻量级的性能分析工具,跟Xdebug类似,但性能开销更低, ...

  3. facebook工具xhprof的安装与使用-分析php执行性能

    下载源码包的网址 http://pecl.php.net/package/xhprof

  4. facebook工具xhprof的安装与使用-分析php执行性能(转载)

    下载源码包的网址 http://pecl.php.net/package/xhprof

  5. PHP性能追踪及分析工具xhprof的安装与使用

    对于本地开发环境来说,进行性能分析xdebug是够用了,但如果是线上环境的话,xdebug消耗较大,配置也不够灵活,因此线上环境建议使用xhprof进行PHP性能追踪及分析. 我们今天就简单介绍一下x ...

  6. 【推荐】CentOS安装PHP-5.6.4+扩展安装+安全配置+性能配置

    注:以下所有操作均在CentOS 6.5 x86_64位系统下完成. #准备工作# 前段时间PHP官方发布了一个重要的安全升级公告,修复了两个unserialize函数的严重漏洞,目前受影响的版本有: ...

  7. eclipse插件本地扩展安装

    (1)在Eclipse 安装路径下新建links 路径. (2) 在links 文件夹内,建立X X X .link 文件,该文件的文件名可随意,但后缀必须是link ,通常推荐该文件的文件名与插件名 ...

  8. linux下Redis与phpredis扩展安装

    ++++++++++++++++++++++++++++++++++++++++++++++linux下Redis与phpredis扩展安装++++++++++++++++++++++++++++++ ...

  9. Centos linux php扩展安装步骤

    使用phpinfo()函数输出PHP信息,然后找到Configuration File (php.ini) apachectl 其设计意图是帮助管理员控制Apache httpd后台守护进程的功能. ...

随机推荐

  1. Linux 环境变量问题

    环境变量延伸: /etc/profile, /etc/bashrc, .bash_profile和.bashrc的差别 用户在登陆Linux操作系统的时候,"/etc/profile&quo ...

  2. [C++]求解三元一次方程组

    /** * author:johnny zen * date:2017-09-20 11:19 * function:Calculate Ternary system of equations * n ...

  3. python技巧 计算字符串中字母出现的次数并取出最大

    有一个字符串 “aaddfdfdercfghfyttefsfsfewretr123trefg5624sdfcgvfdgte6435234532”,现在需要取出里面出现次数最多的字符 第一种方法-装饰器 ...

  4. input框的输入限制

    1.输入数字 <input onKeyUp="value=value.replace(/[^\d|chun]/g,'')"> 2.只输入中文 <input typ ...

  5. Java读取txt文件——(二)

    Txt数据

  6. java.util.Map

    map时key/value形式存储信息的,键可以为对象null public static void main(String[] args) { Map<String, String> m ...

  7. SeaJS入门教程系列之SeaJS介绍(一)

    前言SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架,可以实现JavaScript的模块化开发及加载机制.与jQuery等JavaScript框架不同,SeaJS不会扩展封装 ...

  8. cf787c 博弈论+记忆化搜索

    好题,单纯的就是pn状态的推导 /* 把第一个点标为0,剩下的点按1-n-1编号 胜态是1,败态为0,dp[i][j]表示第i个人,怪兽起始位置在j时的胜负态 把0点设置为必败态,然后对于一个人来说, ...

  9. poj2464扫描线好题,回头再做

    扫描线+区间更新 题解 /* st[i],ol[i]表示y坐标大于y[i]和小于y[i]的点 两颗线段树建立在y轴上,区间[l,r]ol线选在[l,r]时st的分数 每次查询完成后再更新一次 遍历每条 ...

  10. 认识js运动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...