ErrHandler.php 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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(), 'Error Handler:');
  22. CLog::flush();
  23. return TRUE; # 不再继续错误处理的冒泡过程::则代码得以继续执行
  24. // if ($errno == E_USER_ERROR && !(php_sapi_name() === 'cli')) { # 如果是用户自定义错误,直接返回resp, 这种情况的话,可以刷下数据
  25. // CLog::flush(); # 最后再将快速日志刷到文件
  26. // Err($errno); # 直接返回错误响应
  27. // }
  28. }
  29. /**
  30. * 程序运行结束时调用
  31. */
  32. static function shutdown_function() {
  33. $lasterror = error_get_last();
  34. if ($lasterror) { # 如果是异常结束, 记录日志
  35. $msg = CommUtil::str2UTF8(var_export($lasterror, true));
  36. CLog::err($msg, 'Shutdown Handler:');
  37. } else {
  38. // CLog::err("just normal exiting", 'Shutdown Handler:'); # 正常结束运行
  39. }
  40. CLog::flush(); # 最后再将快速日志刷到文件(如果有数据的话)
  41. }
  42. /**
  43. * 自定义异常处理函数, 将捕获的异常信息写入日志
  44. * @param \Exception $exception
  45. */
  46. static function appException($exception) {
  47. $msg = CommUtil::str2UTF8($exception->getMessage())
  48. . ' in ' . CommUtil::str2UTF8($exception->getFile())
  49. . ":" . $exception->getLine();
  50. CLog::err($msg . PHP_EOL . DebugHelper::get_call_stack(), 'Exception Handler:');
  51. CLog::flush(); # 最后再将快速日志刷到文件,因为后续逻辑执行就中断了
  52. }
  53. /**
  54. * 依据全局变量决定是否开启错误handler并设置Err捕获级别
  55. */
  56. static function AutoHookShutdownExceptionHandler() {
  57. if (defined('DEBUGING') && DEBUGING) { # 调试模式,启用所有的php错误报告
  58. error_reporting(E_ALL); # E_ALL : 开启所有错误和警告
  59. register_shutdown_function(array(__CLASS__, 'shutdown_function')); # 插入运行结束时处理代码
  60. set_error_handler(array(__CLASS__, 'error_handler')); # 插入自定义错误处理代码
  61. set_exception_handler(array(__CLASS__, 'appException')); # 插入自定义异常处理代码
  62. } else {
  63. error_reporting(0); # 非调试模式关闭所有的错误报告
  64. }
  65. }
  66. }
  67. // 越早启用捕获的错误信息也就越全面
  68. ErrHandler::AutoHookShutdownExceptionHandler(); # 初始化框架错误捕获机制