PageRenderTime 54ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/XoopsEngine/lib/Xoops/Zend/Log/Writer/Debugger.php

https://github.com/xoops-pi/engine
PHP | 303 lines | 208 code | 37 blank | 58 comment | 33 complexity | 44c51b4961ddd58292de1df4fbb569b9 MD5 | raw file
  1. <?php
  2. /**
  3. * Zend Framework for Xoops Engine
  4. *
  5. * You may not change or alter any portion of this comment or credits
  6. * of supporting developers from this source code or any supporting source code
  7. * which is considered copyrighted (c) material of the original comment or credit authors.
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. *
  12. * @copyright Xoops Engine http://www.xoopsengine.org
  13. * @license http://www.fsf.org/copyleft/gpl.html GNU public license
  14. * @author Taiwen Jiang <phppp@users.sourceforge.net>
  15. * @since 3.0
  16. * @category Xoops_Zend
  17. * @package Log
  18. * @version $Id$
  19. */
  20. class Xoops_Zend_Log_Writer_Debugger extends Zend_Log_Writer_Abstract
  21. {
  22. private $items = array();
  23. /**
  24. * Class Constructor
  25. */
  26. public function __construct()
  27. {
  28. $this->_formatter = new Xoops_Zend_Log_Formatter_Debugger();
  29. }
  30. /**
  31. * Create a new instance of Xoops_Zend_Log_Writer_Debugger
  32. *
  33. * @param array|Zend_Config $config
  34. * @return Zend_Log_Writer_Null
  35. * @throws Zend_Log_Exception
  36. */
  37. static public function factory($config)
  38. {
  39. return new self();
  40. }
  41. /**
  42. * Write a message to the log.
  43. *
  44. * @param array $event event data
  45. * @return void
  46. */
  47. protected function _write($event)
  48. {
  49. list($category, $line) = $this->_formatter->format($event);
  50. $this->items[$category][] = $line;
  51. }
  52. private function systemLog()
  53. {
  54. $system = array();
  55. $files_included = get_included_files();
  56. $system['Included files'] = count ($files_included) . ' files';
  57. $memory = 0;
  58. if (function_exists('memory_get_usage')) {
  59. $memory = memory_get_usage();
  60. if (function_exists('memory_get_peak_usage')) {
  61. $memory .= ' -> ' . memory_get_peak_usage();
  62. }
  63. $memory .= ' bytes';
  64. } else {
  65. // Windows system
  66. if (strpos(strtolower(PHP_OS), 'win') !== false) {
  67. $out = array();
  68. exec('tasklist /FI "PID eq ' . getmypid() . '" /FO LIST', $out);
  69. $memory = substr($out[5], strpos($out[5], ':') + 1);
  70. }
  71. }
  72. $system['Memory usage'] = $memory ?: 'Not detected';
  73. $system['OS'] = PHP_OS ?: 'Not detected';
  74. $system['Web Server'] = $_SERVER['SERVER_SOFTWARE']; //PHP_SAPI ?: 'Not detected';
  75. $system['PHP Version'] = PHP_VERSION;
  76. if (Xoops::registry('db') && method_exists(Xoops::registry('db'), "getServerVersion")) {
  77. $system['MySQL Version'] = Xoops::registry('db')->getServerVersion();
  78. } elseif (isset($GLOBALS['xoopsDB']) && method_exists($GLOBALS['xoopsDB']->conn, "getServerVersion")) {
  79. $system['MySQL Version'] = $GLOBALS['xoopsDB']->conn->getServerVersion();
  80. } else {
  81. $system['MySQL Version'] = "Not detected";
  82. }
  83. $system['Xoops Version'] = Xoops::version();
  84. $system['Zend Version'] = Zend_Version::VERSION;
  85. if (XOOPS::registry("module")) {
  86. $system['Module Version'] = XOOPS::registry("module")->version;
  87. }
  88. if (XOOPS::registry("view")) {
  89. $system['Smarty Version'] = XOOPS::registry("view")->getEngine()->getVersion();
  90. }
  91. $system['Persist Engine'] = Xoops::persist()->getType();
  92. $system['safe_mode'] = ini_get('safe_mode') ? "On" : "Off";
  93. $system['register_globals'] = ini_get('register_globals') ? "On" : "Off";
  94. //$system['xml'] = extension_loaded('xml') ? "On" : "Off";
  95. //$system['mbstring'] = extension_loaded('mbstring') ? "On" : "Off";
  96. $sys_info = "";
  97. foreach ($system as $key => $val) {
  98. $sys_info .= "<div style='clear: both;'><span class='label'>{$key}:</span><span class='text'>{$val}</span></div>";
  99. }
  100. $this->_write(array("category" => "extra", "message" => $sys_info, "priorityName" => "info", "timestamp" => ""));
  101. }
  102. public function render()
  103. {
  104. $this->systemLog();
  105. $log = PHP_EOL;
  106. $log .= "<div id=\"xoops-logger-output\">" . PHP_EOL . "<div id='xoops-logger-tabs'>" . PHP_EOL;
  107. foreach (array_keys($this->items) as $category) {
  108. $count = count($this->items[$category]);
  109. $log .= "<span id='xoops-logger-tab-{$category}'><a href='javascript:xoSwitchCategoryDisplay(\"{$category}\")'>{$category}({$count})</a></span> | " . PHP_EOL;
  110. }
  111. $log .= "<span id='xoops-logger-tab-all'><a href='javascript:xoSwitchCategoryDisplay(\"all\")'>all</a></span>" . PHP_EOL;
  112. $log .= "</div>" . PHP_EOL;
  113. $log .= "<div id='xoops-logger-categories'>" . PHP_EOL;
  114. foreach ($this->items as $category => $events) {
  115. $log .= "<div id='xoops-logger-category-{$category}' class=\"xoops-events\">" . PHP_EOL;
  116. $log .= "<div class=\"xoops-category\">{$category}</div>" . PHP_EOL;
  117. $log .= implode("", $events);
  118. $log .= "</div>" . PHP_EOL;
  119. }
  120. $log .= "</div>" . PHP_EOL . "</div>" . PHP_EOL;
  121. $scripts_css =
  122. <<<EOT
  123. <style type="text/css">
  124. #xoops-logger-output {
  125. font-family: monospace;
  126. padding: 10px;
  127. }
  128. #xoops-logger-output #xoops-logger-tabs {
  129. border-top: 1px solid;
  130. }
  131. #xoops-logger-output #xoops-logger-categories {
  132. display: block;
  133. }
  134. #xoops-logger-output a,
  135. #xoops-logger-output a:visited {
  136. font-weight: normal;
  137. color: inherit;
  138. }
  139. #xoops-logger-output div.xoops-events {
  140. clear: both;
  141. }
  142. #xoops-logger-output div.xoops-category {
  143. font-weight: bold;
  144. padding: 10px 0 5px 0;
  145. }
  146. #xoops-logger-output div.xoops-event {
  147. clear: both;
  148. }
  149. #xoops-logger-output div.xoops-event .time {
  150. font-weight: bold;
  151. }
  152. #xoops-logger-output div.xoops-event .message {
  153. margin-left: 50px;
  154. font-weight: normal;
  155. }
  156. #xoops-logger-output #xoops-logger-errors .xoops-event .message {
  157. color: red;
  158. }
  159. #xoops-logger-output .xoops-event .error,
  160. #xoops-logger-output .xoops-event .err {
  161. color: #FF0000;
  162. font-weight: bold;
  163. }
  164. #xoops-logger-output .xoops-event .exception {
  165. color: #FF0000;
  166. }
  167. #xoops-logger-output .xoops-event .warning,
  168. #xoops-logger-output .xoops-event .warn {
  169. color: #D2691E;
  170. }
  171. #xoops-logger-output .xoops-event .notice {
  172. color: #A0522D;
  173. }
  174. #xoops-logger-output .xoops-event .message span {
  175. padding-left: 5px;
  176. }
  177. #xoops-logger-output .xoops-event .message .label {
  178. width: 150px;
  179. text-align: right;
  180. float: left;
  181. font-weight: bold;
  182. padding: 2px 5px;
  183. }
  184. #xoops-logger-output .xoops-event .message .text {
  185. display: block;
  186. float: left;
  187. padding: 2px 5px;
  188. }
  189. </style>
  190. EOT;
  191. $scripts_js = '<script type="text/javascript">var cookie_path = "' . (($baseUrl = XOOPS::host()->get('baseUrl')) ? rtrim($baseUrl, "/") . "/" : "/") . '";</script>' . PHP_EOL .
  192. <<<EOT
  193. <script type="text/javascript">
  194. var cookieName = "XoopsLoggerView";
  195. function xoLogCreateCookie(name,value) {
  196. value = value ? "+" : "-";
  197. document.cookie = cookieName+"=["+name+value+"]; path=" + cookie_path;
  198. }
  199. function xoLogReadCookie() {
  200. var ret = new Array("", 0);
  201. var nameEQ = cookieName + "=";
  202. var ca = document.cookie.split(';');
  203. for(var i=0;i < ca.length;i++) {
  204. var c = ca[i];
  205. while (c.charAt(0)==' ') c = c.substring(1,c.length);
  206. if (c.indexOf(nameEQ) == 0) {
  207. var valid = c.substring(c.indexOf("[")+1, c.indexOf("]"));
  208. ret[0] = valid.substring(0,valid.length-1);
  209. var str = valid.substring(valid.length-1,valid.length);
  210. ret[1] = (str == "+") ? 1 : 0;
  211. return ret;
  212. }
  213. }
  214. return ret;
  215. }
  216. function xoSwitchCategoryDisplay(name) {
  217. var data = xoLogReadCookie();
  218. var loggerview = (name == data[0]) ? (data[1] ? 0 : 1) : 1;
  219. return xoSetCategoryDisplay(name, loggerview);
  220. }
  221. function xoSetCategoryDisplay(name, loggerview) {
  222. var log = document.getElementById("xoops-logger-categories");
  223. if (!log) return;
  224. var old = xoLogReadCookie();
  225. var oldElt = document.getElementById("xoops-logger-tab-" + old[0]);
  226. if (oldElt) {
  227. oldElt.style.textDecoration = "none";
  228. }
  229. var i, elt;
  230. for (i=0; i!=log.childNodes.length; i++) {
  231. elt = log.childNodes[i];
  232. if (!elt.tagName || elt.tagName.toLowerCase() != 'div' || !elt.id) continue;
  233. var elestyle = elt.style;
  234. if (name == 'all' || elt.id == "xoops-logger-category-" + name) {
  235. if (loggerview) {
  236. elestyle.display = "block";
  237. document.getElementById("xoops-logger-tab-" + name).style.textDecoration = "underline";
  238. } else {
  239. elestyle.display = "none";
  240. document.getElementById("xoops-logger-tab-" + name).style.textDecoration = "none";
  241. }
  242. } else {
  243. elestyle.display = "none";
  244. }
  245. }
  246. log.style.display = "block";
  247. xoLogCreateCookie(name, loggerview);
  248. }
  249. function xoSetLoggerView(data) {
  250. return xoSetCategoryDisplay(data[0], data[1]);
  251. }
  252. function xoSwitchElementDisplay(id) {
  253. var elestyle = document.getElementById(id).style;
  254. if (elestyle.display == "none") {
  255. elestyle.display = "block";
  256. } else {
  257. elestyle.display = "none";
  258. }
  259. }
  260. // set logger output view
  261. xoSetLoggerView(xoLogReadCookie());
  262. </script>
  263. EOT;
  264. echo PHP_EOL . preg_replace('!\s+!', ' ', $scripts_css . $log . $scripts_js);
  265. }
  266. }