ErrHandler.php 3.7 KB

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