>백엔드 개발 >PHP 튜토리얼 >CodeIgniter3.0+ 프레임워크의 사용자 정의 예외 처리 방법 소개

CodeIgniter3.0+ 프레임워크의 사용자 정의 예외 처리 방법 소개

不言
不言앞으로
2019-03-29 10:33:123583검색

이 글은 CodeIgniter3.0+ 프레임워크의 사용자 정의 예외 처리 방법을 소개합니다. 필요한 친구들이 참고할 수 있기를 바랍니다.

Background: ci3.0 프레임워크의 핵심 코드는 자동으로 예외를 구현하고 해당 페이지와 메소드를 구현합니다. 이는 일부 개인화된 요구 사항, 특히 인터페이스 유형 애플리케이션에는 적합하지 않을 수 있습니다. 따라서 핵심코드(시스템 디렉터리에 있는 파일) 수정 없이 예외 처리와 404 및 기타 관련 예외 처리를 변경할 필요가 있다.

메서드 설명

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');
...

위 괄호 안의 메소드는 모두 common.php가 포함된 예외 처리를 위한 코드의 일부입니다. function_exists code>는 전제문입니다. <code>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']));
}

코드 구현

프로젝트 항목 파일 index.php

rrreee에서 다음 메서드를 간단히 다시 작성합니다. 더 흥미로운 콘텐츠를 보려면 PHP 중국어 웹사이트의 PHP 비디오 튜토리얼

컬럼을 주목하세요!

#🎜🎜#

위 내용은 CodeIgniter3.0+ 프레임워크의 사용자 정의 예외 처리 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제