摘要:背景框架核心代碼自動實現(xiàn)了異常,并實現(xiàn)了拋出的對應(yīng)頁面和方法,對于一些個性化需求特別是接口類型的應(yīng)用,會不合適。因此需要在不改版核心代碼目錄下文件,來改變對異常及等相關(guān)異常的處理。方法說明框架比有比較大的改動,其中之一就是對異常的處理。
背景
ci3.0框架核心代碼自動實現(xiàn)了異常,并實現(xiàn)了拋出的對應(yīng)頁面和方法,對于一些個性化需求特別是接口類型的應(yīng)用,會不合適。因此需要在不改版核心代碼 (system目錄下文件),來改變對異常及404等相關(guān)異常的處理。
方法說明ci框架3.0比2.0有比較大的改動,其中之一就是對異常的處理。以下是CodeIgniter-3.1.8systemcoreCodeIgniter.php 中對異常處理的部分代碼
/* * ------------------------------------------------------ * 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"); ...
以上括號內(nèi)的方法均在common.php中以function_exists為前提聲明。
... if ( ! function_exists("_exception_handler")) { ...代碼實現(xiàn)
我們簡單粗暴的在項目入口文件index.php中重寫以下方法
/** * 推送到redis cc異常隊列 * @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 .= "錯誤類型 :" . $error_type . " "; } $trace .= "客戶端IP : " . $_SERVER["REMOTE_ADDR"] . " "; $trace .= "服務(wù)端IP : " . $_SERVER["SERVER_NAME"] . "(" . $_SERVER["SERVER_ADDR"] . ")" . " "; $trace .= "請求地址 : " . (isset($_SERVER["REQUEST_URI"]) ? $_SERVER["REQUEST_URI"] : "empty") . " "; $trace .= "請求參數(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中對應(yīng)方法 * 捕捉語法錯誤 * @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本身語法,對象調(diào)用,參數(shù)類型傳遞等錯誤 * 優(yōu)先重寫common.php中對應(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 = " 錯誤類型: {$error_type}; 文件名: {$exception->getFile()}; 所在行號: {$exception->getLine()}; 錯誤消息: {$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中對應(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 = " 錯誤類型: shutdown; > 文件名: {$last_error["file"]}; 所在行號: {$last_error["line"]}; 錯誤消息: {$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中對應(yīng)方法 * ci 框架內(nèi)部的load異常、config異常、loader異常等會自動拋出, * 但common.php中的函數(shù)定義之類錯誤無法捕捉 * @time 2019/3/20 18:46 * @author tongbo * @param $message * @param int $status_code */ function show_error($message) { $error_msg = "錯誤消息: {$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中對應(yīng)方法 * @time 2019/3/21 15:34 * @author tongbo * @param string $page */ function show_404($page = "") { $error_msg = "錯誤消息: 請求的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"])); }延伸
在基類中可以處理
錯誤等級區(qū)分對待
將錯誤處理寫到其他地方,require_once進來
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/31108.html
摘要:把如下代碼添加到目錄下的文件中類的構(gòu)造函數(shù)之前,這其實就是進行變量聲明,文件也是同樣操作。舉一個我項目中的例子。該類只需要一個構(gòu)造函數(shù)完成上述功能即可。 最近再給一個APP寫API,同時還要寫相應(yīng)的后臺管理網(wǎng)站。為了便于開發(fā)和代碼組織與管理,我決定采用一個現(xiàn)有的框架。Codeigniter由于其輕量容易自定制的特點吸引了我,一路開發(fā)過來也有大半年時間了,寫下一些自己在開發(fā)過程中的一些體...
摘要:如何構(gòu)建一個自己的框架為什么我們要去構(gòu)建一個自己的框架可能絕大多數(shù)的人都會說市面上已經(jīng)那么多的框架了,還造什么輪子。 showImg(https://segmentfault.com/img/bVNg9F?w=500&h=500); 如何構(gòu)建一個自己的PHP框架 為什么我們要去構(gòu)建一個自己的PHP框架?可能絕大多數(shù)的人都會說市面上已經(jīng)那么多的框架了,還造什么輪子?。我的觀點造輪子不是目...
摘要:一的幾個函數(shù)異常捕獲自定義處理函數(shù)注冊錯誤捕獲自定義處理函數(shù)注冊程序執(zhí)行時異常終止錯誤捕獲處理函數(shù)注冊這三個函數(shù)在錯誤處理控制中給開發(fā)者提供了很大的自主空間,在日志系統(tǒng)中記錄日志信息有他們的功勞。下面要說的類庫是借鑒了日志系統(tǒng)的設(shè)計。 引言 接觸過php框架的朋友們可能都知道,日志在項目中的重要作用了,他可以幫助我們定位錯誤的位置,讓程序更友好(處理得當(dāng)?shù)脑挷粫苯訏伋鲆淮蠖阎挥谐?..
閱讀 3743·2021-11-24 09:39
閱讀 3478·2019-08-30 15:56
閱讀 1378·2019-08-30 15:55
閱讀 1042·2019-08-30 15:53
閱讀 1929·2019-08-29 18:37
閱讀 3610·2019-08-29 18:32
閱讀 3137·2019-08-29 16:30
閱讀 2940·2019-08-29 15:14