thinkphp 火狐 FireShowPageTrace

先来两张截图看下效果



配置如下

Application\Common\Conf\tags.php

<?php

return array(
    ‘app_end‘ => array(
        ‘Behavior\FireShowPageTrace‘
    )
);

不过火狐要安装2个插件

Firebug  和 FirePHP



====================================================================================================================================

下面是详细流程

====================================================================================================================================

主要原来:利用firephp的类库

http://www.firephp.org/HQ/Install.htm

下载解压后如下图php5和php4的类库



根据配置文件

‘app_end‘ => array(‘Behavior\FireShowPageTrace‘)

可以看出当App::exec();程序action执行后开始做app_end动作时通过钩子调用 行为扩展


ThinkPHP\Library\Think\App.class.php



会执行FireShowPageTraceBehavior类run方法

// 行为扩展的执行入口必须是run
    public function run(&$params){
            if(C(‘FIRE_SHOW_PAGE_TRACE‘)){
                $this->showTrace();
            }
    }


我们现在看看这个文件ThinkPHP\Library\Behavior\FireShowPageTraceBehavior.class.php

把firephp的类库中的fb.php和FirePHP.class.php合并通过FireShowPageTraceBehavior类的showTrace方法调用显示信息



下面我们研究下showTrace方法

    private function showTrace() {
        // 系统默认显示信息
        $files = get_included_files();
        $info = array();
        foreach ($files as $key => $file) {
            $info[] = $file . ‘ ( ‘ . number_format(filesize($file) / 1024, 2) . ‘ KB )‘;
        }
        $trace = array();
        $base = array(
            ‘请求信息‘ => date(‘Y-m-d H:i:s‘, $_SERVER[‘REQUEST_TIME‘]) . ‘ ‘ . $_SERVER[‘SERVER_PROTOCOL‘] . ‘ ‘ . $_SERVER[‘REQUEST_METHOD‘] . ‘ : ‘ . __SELF__,
            ‘运行时间‘ => $this->showTime(),
            ‘内存开销‘ => MEMORY_LIMIT_ON ? number_format((memory_get_usage() - $GLOBALS[‘_startUseMems‘]) / 1024, 2) . ‘ kb‘ : ‘不支持‘,
            ‘查询信息‘ => N(‘db_query‘) . ‘ queries ‘ . N(‘db_write‘) . ‘ writes ‘,
            ‘文件加载‘ => count(get_included_files()),
            ‘缓存信息‘ => N(‘cache_read‘) . ‘ gets ‘ . N(‘cache_write‘) . ‘ writes ‘,
            ‘配置加载‘ => count(c()),
            ‘会话信息‘ => ‘SESSION_ID=‘ . session_id(),
        );
        // 读取应用定义的Trace文件
        $traceFile = CONF_PATH . ‘trace.php‘;
        if (is_file($traceFile)) {
            $base = array_merge($base, include $traceFile);
        }
        $debug = trace();
        $tabs = C(‘TRACE_PAGE_TABS‘);
        foreach ($tabs as $name => $title) {
            switch (strtoupper($name)) {
                case ‘BASE‘:// 基本信息
                    $trace[$title] = $base;
                    break;
                case ‘FILE‘: // 文件信息
                    $trace[$title] = $info;
                    break;
                default:// 调试信息
                    if (strpos($name, ‘|‘)) {// 多组信息
                        $array = explode(‘|‘, $name);
                        $result = array();
                        foreach ($array as $name) {
                            $result += isset($debug[$name]) ? $debug[$name] : array();
                        }
                        $trace[$title] = $result;
                    } else {
                        $trace[$title] = isset($debug[$name]) ? $debug[$name] : ‘‘;
                    }
            }
        }
        foreach ($trace as $key => $val) {
            if (!is_array($val) && empty($val)) {
                $val = array();
            }
            if (is_array($val)) {
                $fire = array(
                    array(‘‘, ‘‘)
                );
                foreach ($val as $k => $v) {
                    $fire[] = array($k, $v);
                }
                fb(array($key, $fire), FirePHP::TABLE);
            } else {
                fb($val, $key);
            }
        }
        unset($files, $info, $log, $base);
    }


组装数据

foreach ($tabs as $name => $title) {


$tabs = C(‘TRACE_PAGE_TABS‘)= array(‘BASE‘ => ‘基本‘, ‘FILE‘ => ‘文件‘, ‘INFO‘ => ‘流程‘, ‘ERR|NOTIC‘ => ‘错误‘, ‘SQL‘ => ‘SQL‘, ‘DEBUG‘ => ‘调试‘)

会组装成

$tabs[基本]=$base;

$tabs[文件]=$info;

$tabs[流程]=$debug[INFO]

$tabs[SQL]=$debug[SQL]

$tabs[调试]=$debug[DEBUG]


$debug数据是根据Think\Think::trace获取的

$tabs[错误] 看下面代码可以看出

if (strpos($name, ‘|‘)) {// 多组信息
                        $array = explode(‘|‘, $name);
                        $result = array();
                        foreach ($array as $name) {
                            $result += isset($debug[$name]) ? $debug[$name] : array();
                        }
                        $trace[$title] = $result;
} else {

当name中有“|”时则则获取多个信息的合集  此处错误信息是ERR和NOTIC的合集


下面就是循环数组之后调用fb函数输出

 foreach ($trace as $key => $val) {

fb(array($key, $fire), FirePHP::TABLE);



扩展根据自定义Trace文件扩展基本信息代码如下

 // 读取应用定义的Trace文件
$traceFile = CONF_PATH . ‘trace.php‘;
        if (is_file($traceFile)) {
            $base = array_merge($base, include $traceFile);
}
所以可以在Application\Common\Conf\trace.php写自己的扩展信息如下


Application\Common\Conf\trace.php

<?php

return array(
    ‘COOKIE‘ => $_COOKIE,
);




注:firePHP,是通过http headers和firebug通讯的,所以trace之前不能有输出 如

Application\Common\Conf\config.php 开启显示页面Trace信息

<?php


return array(
    ‘SHOW_PAGE_TRACE‘ => TRUE, // 显示页面Trace信息
);


这个时候你应该会遇到一个ThinkPHP的BUG

修改ThinkPHP\Library\Behavior\FireShowPageTraceBehavior.class.php

查找

return new Exception($Message);

改为 

return new \Think\Exception($Message);

原因是抛出的异常已经被ThinkPHP控制了所以FirePHP中的异常会找不到Exception类

修正后你会看到如下图所示




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。