91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

CodeIgniter3.0+框架自如何定義異常處理

發布時間:2020-10-28 14:05:54 來源:億速云 閱讀:254 作者:小新 欄目:編程語言

這篇文章主要介紹了CodeIgniter3.0+框架自如何定義異常處理 ,具有一定借鑒價值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲。下面讓小編帶著大家一起了解一下。

背景:ci3.0框架核心代碼自動實現了異常,并實現了拋出的對應頁面和方法,對于一些個性化需求特別是接口類型的應用,會不合適。因此需要在不改版核心代碼 (system目錄下文件),來改變對異常及404等相關異常的處理。

方法說明

ci框架3.0比2.0有比較大的改動,其中之一就是對異常的處理。以下是CodeIgniter-3.1.8\system\core\CodeIgniter.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');
...

以上括號內的方法均在common.php中以function_exists為前提聲明。

...
if ( ! function_exists('_exception_handler'))
{
...

代碼實現

我們簡單粗暴的在項目入口文件index.php中重寫以下方法

/**
 * 推送到redis 異常隊列
 * @time 2019/3/21 15:29
 * @author 
 * @param $msg
 * @return bool|int|string
 */
function redis_list_add($msg)
{
    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]);
            $trace = $_SERVER['SERVER_NAME'] . " exception\n";
            $trace .= "clint ip is  {$_SERVER['REMOTE_ADDR']} " . ",server is " . $_SERVER['SERVER_NAME'] . "(" . $_SERVER['SERVER_ADDR'] . ")"."\n";
            $trace.= "path is ".(isset($_SERVER['REQUEST_URI'])?$_SERVER['REQUEST_URI']:"empty")."\n";
            $trace .= "request params is =" . print_r($_POST, true);
            return $redis->LPUSH('PHP_ERROR_WARNING', $trace . $msg);
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }
}

/**
 * 優先重寫common.php中對應方法
 * @time 2019/3/21 16:19
 * @author 
 * @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 . "\n" . $filepath . "\n" . $line);
        redis_list_add($error_msg);
        exit(json_encode(['success' => '-1', 'code' => 501, 'msg' => 'error']));
    }
}

/**
 * 捕獲php本身語法,對象調用,參數類型傳遞等錯誤
 * 優先重寫common.php中對應方法
 * ParseError,object(Error),TypeError,Error
 * @time 2019/3/20 18:33
 * @author 
 * @param $exception
 */
function _exception_handler($exception)
{
    $_tmp =& load_class('Exceptions', 'core');
    if (!empty($exception)) {
        $error_msg = ($exception->getMessage() . "\n" . $exception->getTraceAsString());
        redis_list_add($error_msg);
        exit(json_encode(['success' => '-1', 'code' => 501, 'msg' => 'exception']));
    }
}

/**
 * 優先重寫common.php中對應方法
 * require_once('no_exists.php')
 * @time 2019/3/21 9:49
 * @author 
 */
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))) {
        redis_list_add($msg = $last_error['message'] . "\n" . $last_error['file'] . "\n" . $last_error['line'] . "\n");
        exit(json_encode(['success' => '-1', 'code' => 501, 'msg' => 'shutdown']));
    }
}

/**
 * 優先重寫common.php中對應方法
 * ci 框架內部的load異常、config異常、loader異常等會自動拋出,
 * 但common.php中的函數定義之類錯誤無法捕捉
 * @time 2019/3/20 18:46
 * @author 
 * @param $message
 * @param int $status_code
 */
function show_error($message)
{
    redis_list_add($message);
    exit(json_encode(['success' => '-1', 'code' => '503', 'msg' => 'ci_exception_1']));
}

/**
 * 優先重寫common.php中對應方法
 * @time 2019/3/21 15:34
 * @author 
 * @param string $page
 */
function show_404($page = '')
{
    redis_list_add("url: " . $page . " not found");
    exit(json_encode(['success' => '-1', 'code' => '404', 'msg' => 'Not Found']));
}

感謝你能夠認真閱讀完這篇文章,希望小編分享CodeIgniter3.0+框架自如何定義異常處理 內容對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,遇到問題就找億速云,詳細的解決方法等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乡宁县| 中方县| 武功县| 太谷县| 涞水县| 沽源县| 响水县| 汝阳县| 西峡县| 沅江市| 墨江| 舞钢市| 长白| 阜城县| 菏泽市| 博兴县| 滨州市| 哈密市| 广平县| 西平县| 萨迦县| 鸡西市| 连州市| 新兴县| 镇远县| 金塔县| 平利县| 陵川县| 三都| 承德市| 新干县| 铜陵市| 五大连池市| 韶关市| 辽宁省| 班戈县| 阳西县| 阿鲁科尔沁旗| 日照市| 精河县| 永城市|