使用xhprof调试php,检查运行状态和效率瓶颈

xhprof

目的

在win7环境搭建基于apache2和php5的性能监测平台。

环境

  • apache2.2
  • php-5.3.29-nts-Win32-VC9-x86
  • windows7 x64

线上调试可选组合

  • xhprof + uprofiler 【facebook开源组合】
  • xhprof + xhprof.io 【xhprof.io界面升级】【本文方案
  • xhprof + xhgui 【xhgui华丽界面】
  • tideways + xhgui 【需要php5.5,mongodb】
  • xhprof + xhgui
  • uprofiler + xhgui
  • tideways + tideways UI 【支持php5-7界面异常华丽,商业软件一个月39-159欧元】

php扩展

ui显示

  • gajus/xhprof.io 【上次更新2016-09,支持域名检索,使用mysql】
  • perftools/xhgui 【目前更新活跃,不支持按域名检索,使用mongodb,php>=5.5】
  • tideways UI 【商业软件需可试用一个月】

下载对应版本

http://windows.php.net/downloads/pecl/releases/xhprof/0.10.6/

10/23/2013 12:29 PM        81960 php_xhprof-0.10.6-5.3-nts-vc9-x86.zip
10/23/2013 12:29 PM        82425 php_xhprof-0.10.6-5.3-ts-vc9-x86.zip
10/23/2013 12:29 PM        82506 php_xhprof-0.10.6-5.4-nts-vc9-x86.zip
10/23/2013 12:29 PM        83488 php_xhprof-0.10.6-5.4-ts-vc9-x86.zip
10/23/2013 12:29 PM        85630 php_xhprof-0.10.6-5.5-nts-vc11-x64.zip
10/23/2013 12:29 PM        85440 php_xhprof-0.10.6-5.5-nts-vc11-x86.zip
10/23/2013 12:29 PM        85741 php_xhprof-0.10.6-5.5-ts-vc11-x64.zip
10/23/2013 12:29 PM        85774 php_xhprof-0.10.6-5.5-ts-vc11-x86.zip

配置xhprof

将下载好的dll放入phpdir/ext
(若为linux,需要编译原文件)
php.ini末尾加入以下配置信息,注意output_dir文件夹必须创建

[xhprof]  
extension=php_xhprof.dll
; directory used by default implementation of the iXHProfRuns  
; interface (namely, the XHProfRuns_Default class) for storing  
; XHProf runs.  
xhprof.output_dir="C:/xiji/xhprof_log"

重启apache查看phpinfo()

xhprofenabled
xhprof version0.10.3
CPU num4
process bound toCPU 3
CPU logical idClock Rate (MHz)
CPU 02270
CPU 12583
CPU 22591
CPU 32584

可以查看到xhprof 已经安装到了php

安装可视化工具

https://github.com/gajus/xhprof.io(一个年久失修的可视化程序)
可以用,但是有bug

下载安装

  • 从github下载master压缩包
  • 解压到你想放置的目录
  • 执行\xhprof.io-master\setup\database.sql安装数据库
  • 配置数据库\xhprof.io-master\xhprof\includes\config.inc.php
return array(
    'url_base' => 'http://localhost/xhprof.io-master/',
    'url_static' => null, // When undefined, it defaults to $config['url_base'] . 'public/'. This should be absolute URL.
    'pdo' => new PDO('mysql:dbname=test;host=localhost;charset=utf8', 'root', 'root'),
    'enable' =>function(){
        return isset($_GET['debug']);
    }
);
  • 注入文件,enable是配置文件中新增的一个判断函数,可以自定义记录规则。(参考了网上其他博客)
if (extension_loaded('xhprof')) {
    $xhprof_config            = require $_SERVER['DOCUMENT_ROOT'].'/xhprof.io-master/xhprof/includes/config.inc.php';
    if (!empty($xhprof_config['enable']) && $xhprof_config['enable']()) {
        xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
        register_shutdown_function(function() use ($xhprof_config){
            $xhprof_data    = xhprof_disable();
            if (function_exists('fastcgi_finish_request')) {
                fastcgi_finish_request();
            }
            require_once $_SERVER['DOCUMENT_ROOT'].'/xhprof.io-master/xhprof/classes/data.php';
            $xhprof_data_obj    = new \ay\xhprof\Data($xhprof_config['pdo']);
            $xhprof_data_obj->save($xhprof_data);
        });
    }
}

插曲

我发现打开这个分析呈现工具的时候有的时候很卡,所以就给这个程序分析了一下,发现他有个判断版本的程序段
\xhprof.io-master\xhprof\includes\bootstrap.inc.php的81行,进行了curl操作,这个工具的作者在github都说了这个东西不再维护了,所以就没有判断版本的必要,直接注释了就行了
注释掉判断版本相关的代码之后,访问起来快多了

修改版

进行了以下修改

  • 进行了粗略汉化,有些单词不知道确切意思就没改
  • 某些情况下内存使用会出现负数,数据库为无符号型,经过研究界面总是显示绝对值,于是修改为在插入时取绝对值
  • 整理了网上资料修改了注入文件
  • 下载修改版xhprof.io.rar

运行截图

按域名检索

20170516114011.jpg

按路径检索

20170516114027.jpg

按请求检索

20170516114051.jpg

请求调用详情

20170516114118.jpg

参考资料

使用xhprof进行线上PHP性能追踪及分析
github:EvaEngine/xhprof.io

最后修改:2018 年 03 月 08 日 10 : 40 AM

1 条评论

  1. moozik

    当时研究了好久,最后也没用上,并没有什么卵用

发表评论