调试利器Xhprof的安装与使用

一、安装xhprof

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

tar -zxvf xhprof-0.9.4.tgz

cd xhprof-0.9.4/extension/

phpize
./configure --with-php-config=/usr/local/php/bin/php-config

make && make install

二、配置PHP.ini



[xhprof]
extension=xhprof.so;
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
;
;xhprof.output_dir=<directory_for_storing_xhprof_runs>
xhprof.output_dir=/tmp/xhprof

三、测试

server php-fpm restart

yum install -y graphviz

cp examples xhprof_html xhprof_lib  /data/www/xhprof/ -R

测试代码如下

<?php

function bar($x) {
  if ($x > 0) {
    bar($x - 1);
  }
}

function foo() {
  for ($idx = 0; $idx < 5; $idx++) {
    bar($idx);
    $x = strlen("abc");
  }
}

// start profiling
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

// run program
foo();

// stop profiler
$xhprof_data = xhprof_disable();

// display raw xhprof data for the profiler run
print_r($xhprof_data);

$XHPROF_ROOT = realpath(dirname(__FILE__) .‘/..‘);
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

// save raw data for this profiler run using default
// implementation of iXHProfRuns.
$xhprof_runs = new XHProfRuns_Default();

// save the run under a namespace "xhprof_foo"
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");

echo "---------------\n".
     "Assuming you have set up the http based UI for \n".
     "XHProf at some address, you can view run at \n".
     "http://<xhprof-ui-address>/index.php?run=$run_id&source=xhprof_foo\n".
     "---------------\n";

然后在浏览器中运行

Array
(
    [foo==>bar] => Array
        (
            [ct] => 5
            [wt] => 557
            [cpu] => 0
            [mu] => 2668
            [pmu] => 0
        )

    [foo==>strlen] => Array
        (
            [ct] => 5
            [wt] => 124
            [cpu] => 1000
            [mu] => 404
            [pmu] => 0
        )

    [bar==>[email protected]] => Array
        (
            [ct] => 4
            [wt] => 204
            [cpu] => 0
            [mu] => 2068
            [pmu] => 0
        )

    [[email protected]==>[email protected]] => Array
        (
            [ct] => 3
            [wt] => 97
            [cpu] => 0
            [mu] => 1516
            [pmu] => 0
        )

    [[email protected]==>[email protected]] => Array
        (
            [ct] => 2
            [wt] => 41
            [cpu] => 0
            [mu] => 960
            [pmu] => 0
        )

    [[email protected]==>[email protected]] => Array
        (
            [ct] => 1
            [wt] => 9
            [cpu] => 0
            [mu] => 404
            [pmu] => 0
        )

    [main()==>foo] => Array
        (
            [ct] => 1
            [wt] => 1055
            [cpu] => 1000
            [mu] => 3796
            [pmu] => 0
        )

    [main()==>xhprof_disable] => Array
        (
            [ct] => 1
            [wt] => 5
            [cpu] => 0
            [mu] => 412
            [pmu] => 0
        )

    [main()] => Array
        (
            [ct] => 1
            [wt] => 1749
            [cpu] => 1000
            [mu] => 4952
            [pmu] => 0
        )

)
---------------
Assuming you have set up the http based UI for
XHProf at some address, you can view run at
http://<xhprof-ui-address>/index.php?run=55706da1eea18&source=xhprof_foo
---------------

生成图片:http://<xhprof-ui-address>/index.php?run=55706da1eea18&source=xhprof_foo

Inclusive Time (or Subtree Time): Includes time spent in the function as well as in descendant functions called from a given function.
Exclusive Time/Self Time: Measures time spent in the function itself. Does not include time in descendant functions.
Wall Time: a.k.a. Elapsed time or wall clock time.
CPU Time: CPU time in user space + CPU time in kernel space

Inclusive Time                 包括子函数所有执行时间。
Exclusive Time/Self Time      函数执行本身花费的时间,不包括子树执行时间。
Wall Time                        花去了的时间或挂钟时间。
CPU Time                        用户耗的时间+内核耗的时间
Inclusive CPU                  包括子函数一起所占用的CPU
Exclusive CPU                  函数自身所占用的CPU

点击[View Full Callgraph]


更好的注入方式


了解了上面这些,其实就已经可以将xhprof整合到任何我们已有的项目中去了

目前大部分MVC框架都有唯一的入口文件,只需要在入口文件的开始处注入xhprof的逻辑

<?php
//开启xhprof
xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
//在程序结束后收集数据
register_shutdown_function(function() {
    $xhprof_data        = xhprof_disable();

    //让数据收集程序在后台运行
    if (function_exists(‘fastcgi_finish_request‘)) {
        fastcgi_finish_request();
    }

    //保存xhprof数据
    ...
});

但是这样免不了要修改项目的源代码,其实php本身就提供了更好的注入方式,比如将上述逻辑保存为/opt/inject.php,然后修改php fpm配置文件



vi /etc/php5/fpm/php.ini

//修改auto_prepend_file配置

auto_prepend_file = /opt/inject.php

//这样所有的php-fpm请求的php文件前都会自动注入/opt/inject.php文件

//如果使用Nginx的话,还可以通过Nginx的配置文件设置,这样侵入性更小,并且可以实现基于站点的注入。

fastcgi_param PHP_VALUE "auto_prepend_file=/opt/inject.php";

更好的分析工具:xhprof.io还是xhpgui


注入代码后我们还需要实现保存xhprof数据以及展示数据的UI,听起来似乎又是一大堆工作,有现成的轮子可以用吗?


经过搜索和比较,貌似比较好的选择有xhprof.io以及xhpgui

测试地址:https://dev.anuary.com/8d50658e-f8e0-5832-9e82-6b9e8aa940ac/?xhprof[template]=request&xhprof[query][request_id]=108151

				
时间: 2024-12-16 14:53:05

调试利器Xhprof的安装与使用的相关文章

PHP调试利器XDebug的安装与使用

很多PHP程序员调试使用echo.print_r().var_dump().printf()等,虽然对于有较丰富开发经验的程序员来说这些也已经足够了,他们往往可以在程序执行的过程中,通过输出特定变量的值可以判断程序执行是否正确,甚至效率高低也可以看出来(当然可能还需要使用一些时间函数).那么我们为什么还需要一个专门的调试程序来监控我们的程序运行呢? 在我们平时的php开发中,一个大的项目经过长时间的积累以后你会发现性能越来越慢,而性能到底消耗在了什么地方,常常是一个令人头疼的问题,functio

Laravel 调试器 Debugbar 和 数据库导出利器 DbExporter 扩展安装 及 注意事项

一.Debugbar 安装 参考:Laravel 调试利器 -- Laravel Debugbar 扩展包安装及使用教程 的"2.安装"部分 二.DbExporter 安装 参考:Laravel 扩展推荐: DbExporter 逆向 Migration 和 db:seed 注意: 1.默认安装 1.1 版本.建议安装最新的 dev-master 版本: composer require nwidart/db-exporter:dev-master 2.安装好之后,访问网站可能会报错.

前端调试利器---nproxy

前言:习惯了在windows环境中使用Fiddler的童鞋们,是不是感觉它的网络重定向功能很酷,Fiddler能按照你设置的规制捕获网络请求,再指向本地文件,如拦截你的js文件到本地,就能很快的调试线上环境(如后台环境,测试环境,预上线环境等).但是Fiddler的使用对于初学者来说还是稍有困难的,界面功能很多,导致新手无从下手.(我当初就是这样的),并且Fiddler虽然有Mac版本,但是问题很多,我试了好几次都不行. 正文:今天给大家介绍一款新的神器,nproxy.它能通吃windows,l

Javascript 调试利器 Firebug使用详解

Javascript 调试利器 Firebug使用详解 有时候,为了更清楚方便的查看输出信息,我们可能需要将一些调试信息进行分组输出,那么可以使用console.group来对信息进行分组,在组信息输出完成后用console.groupEnd结束分组. 我们测试一下把刚才的4个输出作为一个分组输出,修改代码为: 复制代码 代码如下: console.group('开始分组:'); console.debug('This is console.debug!'); console.info('Thi

xhprof 的安装方法以及xhprof 的使用方法(分析php程序)

1.xhprof的安装方法. 从git上下载xhprof,路径为https://github.com/kungyu/xhprof. cd xhprof/extension phpize ./configure --with-php-config=/usr/local/php/bin/php-config //路径为php-config的实际路径. make && makeinstall make test make test 会提示有几个被禁用的php函数开启. 将安装包里面的两个文件夹

Web调试利器fiddler

抓包工具HTTWATCH 已经过时啦,快来看看当代的宠儿Web调试利器fiddler .fiddler不管是对开发还是测试,还是产品:都是不可多得的工具:开发用来抓包定位问题; 测试用来抓包,回放测试记录,构造发包用例后续请看下面具体链接http://www.testroad.org/News/show.aspx?id=368

linux-c/c++调试利器gdb、ddd小试

linux-c/c++调试利器gdb.ddd小试 原文链接: http://deepfuture.iteye.com/blog/749148 博客分类: C++/C/lisp CC++C#LinuxUbuntu 一.gdb,在shell窗口调试 main.c内容: main.c #include <stdio.h> int main() { int y=0; for (int i=0;i<10;i++){ y+=i; } return 0; } 深未来技术原创文章,如转载,请注明来源ht

Windows GUI代码与Windows消息问题调试利器

Windows GUI代码与Windows消息问题调试利器 记得很久前有这么一种说法: 人类区别于动物的标准就是工具的使用.同样在软件开发这个行业里面,对于工具的使用也是高手和入门级选手的主要区别,高手往往靠工具的使用在关键的时候打开局面,在适当的时候使用适当的工具就往往可以事半功倍. 首先让我们来讨论如下两个简单的问题. 1. 如果你写的一个软件出了一个问题,这个问题只有在关闭程序的时候出现,你怎么调试呢?2. 如果你写的一个软件出了一个问题,这个问题只有在关闭机器的时候出现,你怎么调试呢?3

Reveal1.5破解,iOS_UI调试利器Reveal最新版本破解方法

Reveal1.0.7破解 1.官网下载最新版Reveal,拖动应用程序中,运行一次2.下载16进制编辑器"0xED" for mac(http://dl.vmall.com/c0kjm4b8fu)3.使用"0xED"打开文件"Macintosh HD ? 应用程序 ? Reveal ? Contents ? MacOS ? Reveal"4."0xED"菜单栏的Edit 中,Number mode 选择 Hex5.搜索tex