Files
premium/app/exception/Http.php
T
2025-05-18 07:29:01 +00:00

88 lines
2.7 KiB
PHP
Executable File

<?php
namespace app\exception;
use app\model\api\Log;
use think\exception\Handle;
use Throwable;
/**
* 异常处理接管
* 解决的问题:
* 1.记录数据库日志
* 2.windows环境下,出现异常时,页面输出空白的问题
* Class Http
* @package app\exception
*/
class Http extends Handle
{
/**
* 不需要记录信息(日志)的异常类列表
* 定义为空,说明是所有异常全部都记录
* @var array
*/
protected $ignoreReport = [];
/**
* 记录异常信息(包括日志或者其它方式记录)
*
* @access public
* @param Throwable $exception
* @return void
*/
public function report(Throwable $exception): void
{
// 非命令行下,记录错误日志
if(PHP_SAPI !== 'cli') {
$request = request();
// 记录数据库日志
// 这里必须要try,不然,如果报数据库错误,系统会循环调用异常接管程序,导致500
try{
Log::create([
'rule' => $request->url(),
'request_body' => json_encode(request()->post(), JSON_UNESCAPED_UNICODE),
'request_header' => json_encode(request()->header(), JSON_UNESCAPED_UNICODE),
'ip' => $request->ip(),
'status_code' => 500,
'response_body' => json_encode($this->convertExceptionToArray($exception), JSON_UNESCAPED_UNICODE),
'create_time' => date('Y-m-d H:i:s'),
]);
}catch (\Exception $e){
}
}
// 使用内置的方式记录异常日志
parent::report($exception);
}
/**
* 收集异常数据
* 重写父类此方法,将Server/Request Data进行转码,解决windows环境下,出现异常时,页面输出空白的问题
* @param Throwable $exception
* @return array
*/
protected function convertExceptionToArray(Throwable $exception): array
{
$data = parent::convertExceptionToArray($exception);
$data['tables']['Server/Request Data'] = $this->changeToUtf8($this->app->request->server());
return $data;
}
/**
* 将获取的服务器信息中的中文编码转为utf-8
* 修复在开启debug模式时出现的Malformed UTF-8 characters 错误
* @access protected
* @param $data array
* @return array 转化后的数组
*/
protected function changeToUtf8(array $data): array
{
foreach ($data as $key => $value) {
$data[$key] = is_array($value)?$this->changeToUtf8($value):mb_convert_encoding($value, "UTF-8", mb_detect_encoding($value));
}
return $data;
}
}