ErrHandler.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. namespace loyalsoft;
  3. /**
  4. * 错误处理模块, 主要是捕获框架运行中的异常信息, 并记录到日志中.
  5. * @version
  6. * 1.0.0 功能整理独立成为一个文件. 2017年8月8日 09:04:36. by --gwang
  7. * @author gwang (mail@wanggangzero.cn)
  8. * @copyright ? 2017-8-8, SJZ LoyalSoft Corporation & gwang. All rights reserved.
  9. */
  10. class ErrHandler {
  11. /**
  12. * 自定义错误处理方法
  13. * @param int $errno
  14. * @param string $errstr
  15. * @param string $errfile
  16. * @param int $errline
  17. * @return boolean 此错误,是否继续由其他模块处理(冒泡), true: 停止, false: 继续
  18. */
  19. static function error_handler($errno, $errstr, $errfile, $errline) {
  20. $msg = CommUtil::str2UTF8($errstr) . " in " . CommUtil::str2UTF8($errfile) . ":" . $errline;
  21. CLog::err($msg . PHP_EOL . DebugHelper::get_call_stack(10), 'Error Handler:');
  22. CLog::flush(); # 最后再将快速日志刷到文件
  23. return TRUE; # 不再继续错误处理的冒泡过程
  24. }
  25. /**
  26. * 程序运行结束时调用
  27. */
  28. static function shutdown_function() {
  29. $lasterror = error_get_last();
  30. if ($lasterror) { # 如果是异常结束, 记录日志
  31. $msg = CommUtil::str2UTF8(var_export($lasterror, true));
  32. CLog::err($msg, 'Shutdown Handler:');
  33. } else {
  34. // CLog::err("just normal exiting", 'Shutdown Handler:');
  35. }
  36. CLog::flush(); # 最后再将快速日志刷到文件
  37. }
  38. /**
  39. * 自定义异常处理函数, 将捕获的异常信息写入日志
  40. * @param \Exception $exception
  41. */
  42. static function appException($exception) {
  43. $msg = CommUtil::str2UTF8($exception->getMessage())
  44. . ' in ' . CommUtil::str2UTF8($exception->getFile())
  45. . ":" . $exception->getLine();
  46. CLog::err($msg . PHP_EOL . DebugHelper::get_call_stack(10), 'Exception Handler:');
  47. CLog::flush(); # 最后再将快速日志刷到文件
  48. }
  49. /**
  50. * 依据全局变量决定是否开启错误handler并设置Err捕获级别
  51. */
  52. static function AutoHookShutdownExceptionHandler() {
  53. if (defined('DEBUGING') && DEBUGING) { # 调试模式,启用所有的php错误报告
  54. error_reporting(E_ALL); # E_ALL : 开启所有错误和警告
  55. register_shutdown_function(array(__CLASS__, 'shutdown_function')); # 插入运行结束时处理代码
  56. set_error_handler(array(__CLASS__, 'error_handler')); # 插入自定义错误处理代码
  57. set_exception_handler(array(__CLASS__, 'appException')); # 插入自定义异常处理代码
  58. } else {
  59. error_reporting(0); # 非调试模式关闭所有的错误报告
  60. }
  61. }
  62. }
  63. // 越早启用捕获的错误信息也就越全面
  64. ErrHandler::AutoHookShutdownExceptionHandler(); # 初始化框架错误捕获机制