Heim > Backend-Entwicklung > PHP-Tutorial > Einführung in benutzerdefinierte Ausnahmebehandlungsmethoden im CodeIgniter3.0+-Framework

Einführung in benutzerdefinierte Ausnahmebehandlungsmethoden im CodeIgniter3.0+-Framework

不言
Freigeben: 2023-04-05 18:16:02
nach vorne
3603 Leute haben es durchsucht

Der Inhalt dieses Artikels ist eine Einführung in die benutzerdefinierte Ausnahmebehandlungsmethode des CodeIgniter3.0+-Frameworks. Ich hoffe, dass er für Sie hilfreich ist.

Hintergrund: Der Kerncode des ci3.0-Frameworks implementiert automatisch Ausnahmen und implementiert die entsprechenden ausgelösten Seiten und Methoden. Dies ist möglicherweise für einige personalisierte Anforderungen, insbesondere Schnittstellenanwendungen, nicht geeignet. Daher ist es notwendig, die Behandlung von Ausnahmen und 404 und anderen damit verbundenen Ausnahmen zu ändern, ohne den Kerncode (Dateien im Systemverzeichnis) zu überarbeiten.

Methodenbeschreibung

CI Framework 3.0 weist im Vergleich zu 2.0 wesentliche Änderungen auf, darunter die Behandlung von Ausnahmen. Das Folgende ist Teil des Codes für die Ausnahmebehandlung in 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');
...
Nach dem Login kopieren

Die Methoden in den obigen Klammern sind alle in common.php mit function_exists als Prämisse deklariert.

...
if ( ! function_exists('_exception_handler'))
{
...
Nach dem Login kopieren

Code-Implementierung

Wir schreiben einfach und grob die folgende Methode in der Projekteintragsdatei um 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']));
}
Nach dem Login kopieren

Dieser Artikel ist hier zu Ende und mehr Für weitere spannende Inhalte , können Sie auf die Spalte PHP Video Tutorial auf der chinesischen PHP-Website achten!

Das obige ist der detaillierte Inhalt vonEinführung in benutzerdefinierte Ausnahmebehandlungsmethoden im CodeIgniter3.0+-Framework. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:segmentfault.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage