ShowPageTraceBehavior.class.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2006-2012 http://thinkphp.cn All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
  8. // +----------------------------------------------------------------------
  9. // | Author: liu21st <liu21st@gmail.com>
  10. // +----------------------------------------------------------------------
  11. defined('THINK_PATH') or exit();
  12. /**
  13. * 系统行为扩展:页面Trace显示输出
  14. * @category Think
  15. * @package Think
  16. * @subpackage Behavior
  17. * @author liu21st <liu21st@gmail.com>
  18. */
  19. class ShowPageTraceBehavior extends Behavior {
  20. // 行为参数定义
  21. protected $options = array(
  22. 'SHOW_PAGE_TRACE' => false, // 显示页面Trace信息
  23. 'TRACE_PAGE_TABS' => array('BASE'=>'基本','FILE'=>'文件','INFO'=>'流程','ERR|NOTIC'=>'错误','SQL'=>'SQL','DEBUG'=>'调试'), // 页面Trace可定制的选项卡
  24. 'PAGE_TRACE_SAVE' => false,
  25. );
  26. // 行为扩展的执行入口必须是run
  27. public function run(&$params){
  28. if(!IS_AJAX && C('SHOW_PAGE_TRACE')) {
  29. echo $this->showTrace();
  30. }
  31. }
  32. /**
  33. * 显示页面Trace信息
  34. * @access private
  35. */
  36. private function showTrace() {
  37. // 系统默认显示信息
  38. $files = get_included_files();
  39. $info = array();
  40. foreach ($files as $key=>$file){
  41. $info[] = $file.' ( '.number_format(filesize($file)/1024,2).' KB )';
  42. }
  43. $trace = array();
  44. $base = array(
  45. '请求信息' => date('Y-m-d H:i:s',$_SERVER['REQUEST_TIME']).' '.$_SERVER['SERVER_PROTOCOL'].' '.$_SERVER['REQUEST_METHOD'].' : '.__SELF__,
  46. '运行时间' => $this->showTime(),
  47. '吞吐率' => number_format(1/G('beginTime','viewEndTime'),2).'req/s',
  48. '内存开销' => MEMORY_LIMIT_ON?number_format((memory_get_usage() - $GLOBALS['_startUseMems'])/1024,2).' kb':'不支持',
  49. '查询信息' => N('db_query').' queries '.N('db_write').' writes ',
  50. '文件加载' => count(get_included_files()),
  51. '缓存信息' => N('cache_read').' gets '.N('cache_write').' writes ',
  52. '配置加载' => count(c()),
  53. '会话信息' => 'SESSION_ID='.session_id(),
  54. );
  55. // 读取项目定义的Trace文件
  56. $traceFile = CONF_PATH.'trace.php';
  57. if(is_file($traceFile)) {
  58. $base = array_merge($base,include $traceFile);
  59. }
  60. $debug = trace();
  61. $tabs = C('TRACE_PAGE_TABS');
  62. foreach ($tabs as $name=>$title){
  63. switch(strtoupper($name)) {
  64. case 'BASE':// 基本信息
  65. $trace[$title] = $base;
  66. break;
  67. case 'FILE': // 文件信息
  68. $trace[$title] = $info;
  69. break;
  70. default:// 调试信息
  71. $name = strtoupper($name);
  72. if(strpos($name,'|')) {// 多组信息
  73. $array = explode('|',$name);
  74. $result = array();
  75. foreach($array as $name){
  76. $result += isset($debug[$name])?$debug[$name]:array();
  77. }
  78. $trace[$title] = $result;
  79. }else{
  80. $trace[$title] = isset($debug[$name])?$debug[$name]:'';
  81. }
  82. }
  83. }
  84. if($save = C('PAGE_TRACE_SAVE')) { // 保存页面Trace日志
  85. if(is_array($save)) {// 选择选项卡保存
  86. $tabs = C('TRACE_PAGE_TABS');
  87. $array = array();
  88. foreach ($save as $tab){
  89. $array[] = $tabs[$tab];
  90. }
  91. }
  92. $content = date('[ c ]').' '.get_client_ip().' '.$_SERVER['REQUEST_URI']."\r\n";
  93. foreach ($trace as $key=>$val){
  94. if(!isset($array) || in_array($key,$array)) {
  95. $content .= '[ '.$key." ]\r\n";
  96. if(is_array($val)) {
  97. foreach ($val as $k=>$v){
  98. $content .= (!is_numeric($k)?$k.':':'').print_r($v,true)."\r\n";
  99. }
  100. }else{
  101. $content .= print_r($val,true)."\r\n";
  102. }
  103. $content .= "\r\n";
  104. }
  105. }
  106. error_log(str_replace('<br/>',"\r\n",$content), Log::FILE,LOG_PATH.date('y_m_d').'_trace.log');
  107. }
  108. unset($files,$info,$base);
  109. // 调用Trace页面模板
  110. ob_start();
  111. include C('TMPL_TRACE_FILE')?C('TMPL_TRACE_FILE'):THINK_PATH.'Tpl/page_trace.tpl';
  112. return ob_get_clean();
  113. }
  114. /**
  115. * 获取运行时间
  116. */
  117. private function showTime() {
  118. // 显示运行时间
  119. G('beginTime',$GLOBALS['_beginTime']);
  120. G('viewEndTime');
  121. // 显示详细运行时间
  122. return G('beginTime','viewEndTime').'s ( Load:'.G('beginTime','loadTime').'s Init:'.G('loadTime','initTime').'s Exec:'.G('initTime','viewStartTime').'s Template:'.G('viewStartTime','viewEndTime').'s )';
  123. }
  124. }