摘要:背景框架核心代碼自動(dòng)實(shí)現(xiàn)了異常,并實(shí)現(xiàn)了拋出的對(duì)應(yīng)頁(yè)面和方法,對(duì)于一些個(gè)性化需求特別是接口類型的應(yīng)用,會(huì)不合適。因此需要在不改版核心代碼目錄下文件,來改變對(duì)異常及等相關(guān)異常的處理。方法說明框架比有比較大的改動(dòng),其中之一就是對(duì)異常的處理。
背景
ci3.0框架核心代碼自動(dòng)實(shí)現(xiàn)了異常,并實(shí)現(xiàn)了拋出的對(duì)應(yīng)頁(yè)面和方法,對(duì)于一些個(gè)性化需求特別是接口類型的應(yīng)用,會(huì)不合適。因此需要在不改版核心代碼 (system目錄下文件),來改變對(duì)異常及404等相關(guān)異常的處理。
方法說明ci框架3.0比2.0有比較大的改動(dòng),其中之一就是對(duì)異常的處理。以下是CodeIgniter-3.1.8systemcoreCodeIgniter.php 中對(duì)異常處理的部分代碼
/* * ------------------------------------------------------ * Define a custom error handler so we can log PHP errors * ------------------------------------------------------ */ set_error_handler("_error_handler"); set_exception_handler("_exception_handler"); register_shutdown_function("_shutdown_handler"); ...
以上括號(hào)內(nèi)的方法均在common.php中以function_exists為前提聲明。
... if ( ! function_exists("_exception_handler")) { ...代碼實(shí)現(xiàn)
我們簡(jiǎn)單粗暴的在項(xiàng)目入口文件index.php中重寫以下方法
/** * 推送到redis cc異常隊(duì)列 * @time 2019/3/21 15:29 * @author tongbo * @param $msg * @param $error_type * @param $error_code * @return bool|int|string */ function redis_list_add($msg, $error_type, $error_code) { ini_set("default_socket_timeout", -1); $v = explode(":", $_SERVER["SITE_REDIS_SERVER"]); if (is_array($v) && !empty($v)) { try { $redis = new redis(); $redis->pconnect($v[0], $v[1]); $space = " "; $trace = ""; if ($error_code) { $trace .= "狀態(tài)碼 :" . $error_code . " "; } if ($error_type) { $trace .= "錯(cuò)誤類型 :" . $error_type . " "; } $trace .= "客戶端IP : " . $_SERVER["REMOTE_ADDR"] . " "; $trace .= "服務(wù)端IP : " . $_SERVER["SERVER_NAME"] . "(" . $_SERVER["SERVER_ADDR"] . ")" . " "; $trace .= "請(qǐng)求地址 : " . (isset($_SERVER["REQUEST_URI"]) ? $_SERVER["REQUEST_URI"] : "empty") . " "; $trace .= "請(qǐng)求參數(shù) : =" . print_r($_REQUEST ? $_REQUEST : $_GET, true) . " "; return $redis->LPUSH("CC_PHP_ERROR_WARNING", $space . $msg . $space . $trace); } catch (Exception $e) { return $e->getMessage(); } } } /** * 優(yōu)先重寫common.php中對(duì)應(yīng)方法 * 捕捉語法錯(cuò)誤 * @time 2019/3/21 16:19 * @author tongbo * @param $severity * @param $message * @param $filepath * @param $line */ function _error_handler($severity, $message, $filepath, $line) { $is_error = (((E_ERROR | E_PARSE | E_COMPILE_ERROR | E_CORE_ERROR | E_USER_ERROR | E_STRICT) & $severity) === $severity); if ($is_error) { $error_msg = $message . " " . $filepath . " " . $line; $error_code = "501"; redis_list_add($error_msg, "Error_Handler異常", $error_code); exit(json_encode(["success" => "-1", "code" => $error_code, "msg" => "error"])); } } /** * 捕獲php本身語法,對(duì)象調(diào)用,參數(shù)類型傳遞等錯(cuò)誤 * 優(yōu)先重寫common.php中對(duì)應(yīng)方法 * ParseError,object(Error),TypeError,Error * @time 2019/3/20 18:33 * @author tongbo * @param $exception */ function _exception_handler($exception) { if (!empty($exception)) { $error_type = get_class($exception); $error_msg = " 錯(cuò)誤類型: {$error_type}; 文件名: {$exception->getFile()}; 所在行號(hào): {$exception->getLine()}; 錯(cuò)誤消息: {$exception->getMessage()}; "; $error_code = "502"; redis_list_add($error_msg, $error_type, $error_code); exit(json_encode(["success" => "-1", "code" => $error_code, "msg" => "exception"])); } } /** * 優(yōu)先重寫common.php中對(duì)應(yīng)方法 * require_once("no_exists.php") * @time 2019/3/21 9:49 * @author tongbo */ function _shutdown_handler() { $last_error = error_get_last(); if (isset($last_error) && ($last_error["type"] & (E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING))) { $error_msg = " 錯(cuò)誤類型: shutdown; > 文件名: {$last_error["file"]}; 所在行號(hào): {$last_error["line"]}; 錯(cuò)誤消息: {$last_error["message"]}; "; $error_code = "503"; redis_list_add($error_msg, "Shut_Down異常", $error_code); exit(json_encode(["success" => "-1", "code" => $error_code, "msg" => "shutdown"])); } } /** * 優(yōu)先重寫common.php中對(duì)應(yīng)方法 * ci 框架內(nèi)部的load異常、config異常、loader異常等會(huì)自動(dòng)拋出, * 但common.php中的函數(shù)定義之類錯(cuò)誤無法捕捉 * @time 2019/3/20 18:46 * @author tongbo * @param $message * @param int $status_code */ function show_error($message) { $error_msg = "錯(cuò)誤消息: {$message}; "; $error_code = "504"; redis_list_add($error_msg, "框架加載異常", $error_code); exit(json_encode(["success" => "-1", "code" => $error_code, "msg" => "ci_exception_1"])); } /** * 優(yōu)先重寫common.php中對(duì)應(yīng)方法 * @time 2019/3/21 15:34 * @author tongbo * @param string $page */ function show_404($page = "") { $error_msg = "錯(cuò)誤消息: 請(qǐng)求的URL: " . $page . " 404 not found"; $error_code = "404"; redis_list_add($error_msg, "文件不存在", $error_code); exit(json_encode(["success" => "-1", "code" => $error_code, "msg" => "Not Found"])); }延伸
在基類中可以處理
錯(cuò)誤等級(jí)區(qū)分對(duì)待
將錯(cuò)誤處理寫到其他地方,require_once進(jìn)來
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/31108.html
摘要:把如下代碼添加到目錄下的文件中類的構(gòu)造函數(shù)之前,這其實(shí)就是進(jìn)行變量聲明,文件也是同樣操作。舉一個(gè)我項(xiàng)目中的例子。該類只需要一個(gè)構(gòu)造函數(shù)完成上述功能即可。 最近再給一個(gè)APP寫API,同時(shí)還要寫相應(yīng)的后臺(tái)管理網(wǎng)站。為了便于開發(fā)和代碼組織與管理,我決定采用一個(gè)現(xiàn)有的框架。Codeigniter由于其輕量容易自定制的特點(diǎn)吸引了我,一路開發(fā)過來也有大半年時(shí)間了,寫下一些自己在開發(fā)過程中的一些體...
摘要:如何構(gòu)建一個(gè)自己的框架為什么我們要去構(gòu)建一個(gè)自己的框架可能絕大多數(shù)的人都會(huì)說市面上已經(jīng)那么多的框架了,還造什么輪子。 showImg(https://segmentfault.com/img/bVNg9F?w=500&h=500); 如何構(gòu)建一個(gè)自己的PHP框架 為什么我們要去構(gòu)建一個(gè)自己的PHP框架?可能絕大多數(shù)的人都會(huì)說市面上已經(jīng)那么多的框架了,還造什么輪子?。我的觀點(diǎn)造輪子不是目...
摘要:一的幾個(gè)函數(shù)異常捕獲自定義處理函數(shù)注冊(cè)錯(cuò)誤捕獲自定義處理函數(shù)注冊(cè)程序執(zhí)行時(shí)異常終止錯(cuò)誤捕獲處理函數(shù)注冊(cè)這三個(gè)函數(shù)在錯(cuò)誤處理控制中給開發(fā)者提供了很大的自主空間,在日志系統(tǒng)中記錄日志信息有他們的功勞。下面要說的類庫(kù)是借鑒了日志系統(tǒng)的設(shè)計(jì)。 引言 接觸過php框架的朋友們可能都知道,日志在項(xiàng)目中的重要作用了,他可以幫助我們定位錯(cuò)誤的位置,讓程序更友好(處理得當(dāng)?shù)脑挷粫?huì)直接拋出一大堆只有程...
閱讀 3729·2021-11-24 09:39
閱讀 3444·2019-08-30 15:56
閱讀 1370·2019-08-30 15:55
閱讀 1031·2019-08-30 15:53
閱讀 1919·2019-08-29 18:37
閱讀 3601·2019-08-29 18:32
閱讀 3128·2019-08-29 16:30
閱讀 2918·2019-08-29 15:14