CodeIgniter3.0+フレームワークカスタム例外処理実装


背景
ci3.0フレームワークのコアコードは自動的に異常を実現し、放出された対応するページと方法を実現し、いくつかの個性的な需要、特にインタフェースタイプの応用には不適切である.したがって、異常および404などの関連異常に対する処理を変更するために、コアコード(systemディレクトリ下のファイル)を改版しない必要がある.
メソッドの説明
ciフレーム3.0は2.0より比較的大きな変更があり,そのうちの1つは異常に対する処理である.以下、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 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 .= " :" . $error_code . "
"; } if ($error_type) { $trace .= " :" . $error_type . "
"; } $trace .= " IP : " . $_SERVER['REMOTE_ADDR'] . "
"; $trace .= " IP : " . $_SERVER['SERVER_NAME'] . "(" . $_SERVER['SERVER_ADDR'] . ")" . "
"; $trace .= " : " . (isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : "empty") . "
"; $trace .= " : =" . print_r($_REQUEST ? $_REQUEST : $_GET, true) . "
"; return $redis->LPUSH('CC_PHP_ERROR_WARNING', $space . $msg . $space . $trace); } catch (Exception $e) { return $e->getMessage(); } } } /** * common.php * * @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 , , * common.php * 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'])); } } /** * common.php * 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'])); } } /** * common.php * ci load 、config 、loader , * common.php * @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'])); } /** * common.php * @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'])); }

延長
  • は、ベースクラスにおいて
  • を処理することができる.
  • エラーレベル区分
  • エラー処理を他の場所に書きます.require_once入って