热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

phpshowpagetrace,thinkphp火狐FireShowPageTrace|学步园

先来两张截图看下效果配置如下Application\Common\Conf\tags.phpreturnarray(app_endarray(Behavior\FireShowP

先来两张截图看下效果

1b54ca8354bf5f8ad214512b9501aa96.png

2826367feb6fabfaa1f4b26bad21469e.png

配置如下

Application\Common\Conf\tags.php

return array(

'app_end' => array(

'Behavior\FireShowPageTrace'

)

);

不过火狐要安装2个插件

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

下面是详细流程

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

主要原来:利用firephp的类库

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

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

948670cd1da97bbf1bd2ae58607508a3.png

根据配置文件

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

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

ThinkPHP\Library\Think\App.class.php

36eda979fe15e7c51eb9f34ffb1a7221.png

会执行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方法调用显示信息

f4a7c85301062e85ef6a6e5ba1e5c254.png

下面我们研究下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

return array(

'COOKIE' => $_COOKIE,

);

9d0a78c74146c5c14049a4627a813403.png

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

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

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类

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

17ed4cc89ddd85c9b5b011318532fe5d.png



推荐阅读
author-avatar
木维韵_538
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有