123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- <?php
- namespace fecshop\components;
- use Yii;
- use yii\web\ErrorHandler;
- use yii\base\Exception;
- /**
- * 异常捕获器
- */
- class AppfrontErrorHandler extends ErrorHandler
- {
- /**
- * [renderException description]
- * @param $exception | Object 异常数据对象
- *
- */
- public function renderException($exception)
- {
- //echo 1;exit;
- // 获取异常数据 , 404页面不做收集
- $code = $exception->statusCode ?: 500;
- if ($code != 404) {
- method_exists($exception,'getMessage') ? $message = $exception->getMessage() : $message = '';
- method_exists($exception,'getName') ? $name = $exception->getName() : $name = '';
- method_exists($exception,'getFile') ? $file = $exception->getFile() : $file = '';
- method_exists($exception,'getLine') ? $line = $exception->getLine() : $line = '';
- method_exists($exception,'getTraceAsString') ? $traceString = $exception->getTraceAsString() : $traceString = '';
-
- $time = time();
- $ip = Yii::$app->request->userIP;
- $url = Yii::$service->url->getCurrentUrl();
- $req_info = $this->getRequestInfo();
- $response = Yii::$app->response;
- Yii::$app->response->format = $response::FORMAT_JSON;
- if (YII_ENV_PROD) {
-
- $errorKey = $this->saveProdException($code, $message, $file, $line, $time, $ip, $name, $traceString, $url, $req_info);
- Yii::$app->response->data = [
- 'code' => $code,
- 'error_no' => $errorKey,
- ];
- Yii::$app->response->send();
- Yii::$app->end();
- } else {
- $time = date('Y-m-d H:i:s', $time);
- $exceptionInfo = [
- 'code' => $code,
- 'message' => $message,
- 'file' => $file,
- 'line' => $line,
- 'time' => $time,
- 'ip' => $ip,
- 'name' => $name,
- 'traceString' => $traceString,
- ];
- Yii::$app->response->data = $exceptionInfo;
- Yii::$app->response->send();
- Yii::$app->end();
- }
- } else {
- parent::renderException($exception);
- }
- }
-
- public function getRequestInfo(){
- $request = Yii::$app->request;
- $ajax = 0;
- $request_type = '';
- $request_data = [];
- $header_accept = '';
- $header_user_agent = '';
- if ($request->isAjax) {
- $ajax = 1;
- }
- if ($request->isGet) {
- $request_type = 'get';
- $request_data = $request->get();
- }
- if ($request->isPost) {
- $request_type = 'post';
- $request_data = $request->post();
- }
- // $headers is an object of yii\web\HeaderCollection
- $headers = $request->getHeaders();
- $headers_arr = [];
- if (is_object($headers) or is_array($headers)) {
- foreach ($headers as $k=>$v) {
- $headers_arr[$k] = $v;
- }
- }
- $userHost = Yii::$app->request->userHost;
- $userIP = Yii::$app->request->userIP;
- return [
- 'ajax' => $ajax,
- 'request_type' => $request_type,
- 'request_data' => $request_data,
- 'headers_data' => $headers_arr,
- 'userHost' => $userHost,
- 'userIP' => $userIP,
- ];
- }
-
- public function saveProdException($code, $message, $file, $line, $created_at, $ip, $name, $trace_string, $url, $req_info){
- return Yii::$service->helper->errorHandler->saveByErrorHandler(
- $code, $message, $file, $line, $created_at,
- $ip, $name, $trace_string, $url, $req_info
- );
-
- }
- /**
- * 这块代码目前没有编写,您也可以用 Sentry(错误日志收集框架) 来收集错误日志。
- * $option = [
- * 'fromMail' => 'xxx@xxx.com',
- * 'subject' => 'fecshop报错 Code:' . $exceptionInfo['code'],
- * 'htmlBody' => '异常' . '(' . YII_ENV . ')' . $exceptionInfo['code'] . ':' . $exceptionInfo['message'] . '<br />文件:' . $exceptionInfo['file'] . ':' . $exceptionInfo['line'] . '<br /> 时间:' . $exceptionInfo['time'] . '<br />请求ip:' . $exceptionInfo['ip'],
- * ];
- *
- *
- *if (!$result) {
- * throw new Exception("Exception mail send faild!", 1);
- *}
- */
- }
|