Http.php 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <?php
  2. namespace app\exception;
  3. use app\model\api\Log;
  4. use think\exception\Handle;
  5. use Throwable;
  6. /**
  7. * 异常处理接管
  8. * 解决的问题:
  9. * 1.记录数据库日志
  10. * 2.windows环境下,出现异常时,页面输出空白的问题
  11. * Class Http
  12. * @package app\exception
  13. */
  14. class Http extends Handle
  15. {
  16. /**
  17. * 不需要记录信息(日志)的异常类列表
  18. * 定义为空,说明是所有异常全部都记录
  19. * @var array
  20. */
  21. protected $ignoreReport = [];
  22. /**
  23. * 记录异常信息(包括日志或者其它方式记录)
  24. *
  25. * @access public
  26. * @param Throwable $exception
  27. * @return void
  28. */
  29. public function report(Throwable $exception): void
  30. {
  31. // 非命令行下,记录错误日志
  32. if(PHP_SAPI !== 'cli') {
  33. $request = request();
  34. // 记录数据库日志
  35. // 这里必须要try,不然,如果报数据库错误,系统会循环调用异常接管程序,导致500
  36. try{
  37. Log::create([
  38. 'rule' => $request->url(),
  39. 'request_body' => json_encode(request()->post(), JSON_UNESCAPED_UNICODE),
  40. 'request_header' => json_encode(request()->header(), JSON_UNESCAPED_UNICODE),
  41. 'ip' => $request->ip(),
  42. 'status_code' => 500,
  43. 'response_body' => json_encode($this->convertExceptionToArray($exception), JSON_UNESCAPED_UNICODE),
  44. 'create_time' => date('Y-m-d H:i:s'),
  45. ]);
  46. }catch (\Exception $e){
  47. }
  48. }
  49. // 使用内置的方式记录异常日志
  50. parent::report($exception);
  51. }
  52. /**
  53. * 收集异常数据
  54. * 重写父类此方法,将Server/Request Data进行转码,解决windows环境下,出现异常时,页面输出空白的问题
  55. * @param Throwable $exception
  56. * @return array
  57. */
  58. protected function convertExceptionToArray(Throwable $exception): array
  59. {
  60. $data = parent::convertExceptionToArray($exception);
  61. $data['tables']['Server/Request Data'] = $this->changeToUtf8($this->app->request->server());
  62. return $data;
  63. }
  64. /**
  65. * 将获取的服务器信息中的中文编码转为utf-8
  66. * 修复在开启debug模式时出现的Malformed UTF-8 characters 错误
  67. * @access protected
  68. * @param $data array
  69. * @return array 转化后的数组
  70. */
  71. protected function changeToUtf8(array $data): array
  72. {
  73. foreach ($data as $key => $value) {
  74. $data[$key] = mb_convert_encoding($value, "UTF-8", "GBK, GBK2312");
  75. }
  76. return $data;
  77. }
  78. }