国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

CodeIgniter3.0+框架自定義異常處理實(shí)現(xiàn)

LinkedME2016 / 3275人閱讀

摘要:背景框架核心代碼自動(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

相關(guān)文章

  • PHP項(xiàng)目中CodeIgniter使用的一些建議

    摘要:把如下代碼添加到目錄下的文件中類的構(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ā)過程中的一些體...

    Barrior 評(píng)論0 收藏0
  • 0開始構(gòu)建一個(gè)屬于你己的PHP框架

    摘要:如何構(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)造輪子不是目...

    vpants 評(píng)論0 收藏0
  • PHP框架中的日志系統(tǒng)

    摘要:一的幾個(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ì)直接拋出一大堆只有程...

    ningwang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<