statusCode ?: 500; 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(); } } 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'] . '
文件:' . $exceptionInfo['file'] . ':' . $exceptionInfo['line'] . '
时间:' . $exceptionInfo['time'] . '
请求ip:' . $exceptionInfo['ip'], * ]; * * *if (!$result) { * throw new Exception("Exception mail send faild!", 1); *} */ }