DebugHelper.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <?php
  2. namespace loyalsoft;
  3. /**
  4. * 调试辅助脚本,目前主要集中在输出功能.
  5. * @version
  6. * 2.0.1 添加检查PHP version和extensions的方法. --gwang 2019年8月16日 15:15:48
  7. * 1.0.0 Created at 2016-7-1. by --gwang
  8. * @author gwang (mail@wanggangzero.cn)
  9. * @copyright © 2016-7-1, SJZ LoyalSoft Corporation & gwang. All rights reserved.
  10. */
  11. class DebugHelper {
  12. /**
  13. * @return bool 调试输出是否开启
  14. */
  15. private static function isDebugging() {
  16. return defined("GAME_ONLINE") && !GAME_ONLINE; # 线上版屏蔽输出
  17. }
  18. /**
  19. * 浏览器打印调试信息
  20. * @param mixed $msg 对象或数组将会被序列化为json串
  21. */
  22. public static function debug($msg) {
  23. if (self::isDebugging()) {
  24. if (is_array($msg) || is_object($msg)) {
  25. $msg = json_encode($msg);
  26. }
  27. echoLine('[' . TimeUtil::dtCurrent() . ']| ' . $msg);
  28. }
  29. }
  30. /**
  31. * var_dump输出变量,统一入口的话, 上线的时候通过统一变量关闭,防止漏删除的意外输出.
  32. * @param mixed $obj
  33. */
  34. public static function var_dump($obj) {
  35. if (!self::isDebugging()) {
  36. return;
  37. }
  38. $pos = self::get_call_stack();
  39. $stack = explode('<br/>', $pos);
  40. $n = 3 > count($stack) ? count($stack) : 3;
  41. for ($i = 0; $i < $n; $i++) {
  42. echoLine($stack[$i]);
  43. }
  44. echoLine(); # 换个行
  45. var_dump($obj);
  46. }
  47. /**
  48. * 浏览器输出调用堆栈
  49. * @return void
  50. */
  51. public static function print_stack_trace() {
  52. /* * * * *
  53. * 因为debug_print_backtrace()格式不太易读,自己调整下输出样式
  54. * * * */
  55. $html = self::get_call_stack();
  56. self::debug($html);
  57. }
  58. /**
  59. * 尝试从array中取出一个命名变量, Ps.可以取消5.3中的Notice
  60. * @param arry $arr
  61. * @param string $strFieldName
  62. * @return mixed
  63. */
  64. static private function arr_get($arr, $strFieldName) {
  65. if (isset($arr[$strFieldName])) {
  66. return $arr[$strFieldName];
  67. }
  68. return null;
  69. }
  70. /**
  71. * 获得调用堆栈
  72. * @param int $levelnum 想要获得的调用层次,default is 3
  73. * @return string formated string
  74. */
  75. static public function get_call_stack($levelnum = 3) {
  76. $array = debug_backtrace();
  77. $outHtml = PHP_EOL;
  78. array_shift($array); # 移除get_call_stack函数自身
  79. $n = 1;
  80. foreach ($array as $row) {
  81. $outHtml .= "\t" . CommUtil::str2UTF8(self::arr_get($row, 'file')) # windows下路径(gb2312)转码
  82. . ', row: ' . self::arr_get($row, 'line') . ', method: ' # line
  83. . self::arr_get($row, 'function') . ";<br/>" . PHP_EOL; # func
  84. if ($levelnum <= $n++) {
  85. break;
  86. }
  87. }
  88. return $outHtml;
  89. }
  90. /**
  91. * 浏览器弹窗提示
  92. * @param string $msg
  93. */
  94. public static function alert($msg) {
  95. if (self::isDebugging()) {
  96. echo "<Script language=\"javascript\">alert(\"" . $msg . "\");</Script>";
  97. }
  98. }
  99. /**
  100. * 检查模块是否加载
  101. * @param string[] $arr 要检查的模块名称
  102. */
  103. public static function checkModules($arr = array()) {
  104. $default = array(# # 基础模块
  105. "curl",
  106. "mbstring",
  107. "openssl",
  108. "pdo_mysql",
  109. "sockets",
  110. "zlib",
  111. );
  112. $r_modules = array_merge($default, $arr); # 合并指定模块
  113. $diff = array_diff($r_modules, get_loaded_extensions()); # 判断缺失模块
  114. if (count($diff)) { # 确实缺失模块
  115. die("require modules: " . implode(' ,', $diff)); # 直接结束运行
  116. }
  117. return true; # 返回true
  118. }
  119. /**
  120. * 检查PHP版本
  121. * @param string $ver 最低版本字符串类似于7.3.5
  122. */
  123. public static function checkkPHPVersion($ver) {
  124. $default_ver = "5.4.16";
  125. $r_ver = isset($ver) ? $ver : $default_ver;
  126. if (version_compare(PHP_VERSION, $r_ver, '<')) {
  127. die('<font color="red">This code request at least PHP version ' . $r_ver #
  128. . ', Current version: ' . PHP_VERSION . ".</font><br/>" . PHP_EOL);
  129. }
  130. }
  131. }