kslimani/cerberus

PHP 错误处理器

0.2.1 2015-11-09 15:04 UTC

This package is not auto-updated.

Last update: 2024-09-18 09:00:31 UTC


README

简单的 PHP 错误处理器。

注册

composer.json 文件中添加

{
    "require": {
        "kslimani/cerberus": "~0.1.0"
    },
}

用法

快速设置

error_reporting(-1);

use Cerberus\ErrorHandler;
use Cerberus\Handler\DebugHandler;

$errorHandler = new ErrorHandler;
$errorHandler->addHandler(new DebugHandler);

Cerberus 附带一个 PSR-3 Logger Interface 错误处理器

use Cerberus\ErrorHandler;
use Cerberus\Handler\LoggerHandler;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$errorHandler = new ErrorHandler;
$logger = new Logger('errors');
$logger->pushHandler(new StreamHandler('/path/to/errors.log', Logger::NOTICE));
$errorHandler->addHandler(new LoggerHandler($logger));

也可以添加可调用的处理器

use Cerberus\ErrorHandler;

$errorHandler = new ErrorHandler;
$errorHandler->addHandler(function($message, $extra) {

    // $message is a formatted error message
    // $extra is an array with error/exception details

});

错误/异常详情

详情数组内容根据错误类型而有所不同。

错误


[
    'displayType' : 'The error display type',
    'context'     : 'The application context',
    'memory'      : 'The memory peak usage, ONLY if debug is true',
    'trace'       : 'The error backtrace, ONLY if debug is true',
    'type'        : 'The error type, ONLY in CallableHandler',
    'message'     : 'The error message, ONLY in CallableHandler',
    'file'        : 'The error file, ONLY in CallableHandler',
    'line'        : 'The error line, ONLY in CallableHandler',
]

异常


[
    'displayType' : 'The error display type',
    'exception'   : 'The exception object',
    'memory'      : 'The memory peak usage, ONLY if debug is true',
    'code'        : 'The http status code, ONLY if instance of HttpExceptionInterface',
]

注意: HttpExceptionInterface 指的是 Symfony\Component\HttpKernel\Exception\HttpExceptionInterface

错误处理器优先级

错误处理器按照优先级排序(从高到低)。

第一个添加的处理器优先级为 10,第二个是 11,等等...

可以使用 setPriority() 方法更改优先级,并且必须在添加处理器之前设置。

  • DebugHandler 默认优先级值为 0(最后处理器)
  • LoggerHandler 默认优先级值为 100(第一个处理器)
  • NewRelicHandler 默认优先级值为 95(在 LoggerHandler 之后)

Silex 集成示例

此 Silex 示例应用程序应处理所有 PHP 错误

use Cerberus\ErrorHandler;
use Cerberus\Handler\DebugHandler;
use Cerberus\Handler\LoggerHandler;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Silex\Application;
use Silex\Provider\TwigServiceProvider;
use Symfony\Component\HttpFoundation\Response;

// Setup autoloader

require_once '/path/to/vendor/autoload.php';

$debug = true;
error_reporting(-1);
ini_set('display_errors', 0);

// Setup error handler

$errorHandler = new ErrorHandler;
$errorHandler
    ->setDebug($debug)
    ->setThrowExceptions(false)
    ->setThrowNonFatal(false)
    ->setCallPreviousErrorHandler(false)
    ->setCallPreviousExceptionHandler(false)
;
if ($debug) {
    $errorHandler->addHandler(new DebugHandler(false));
}

$logger = new Logger('errors');
$logger->pushHandler(new StreamHandler('/path/to/errors.log', Logger::NOTICE));
$errorHandler->addHandler(new LoggerHandler($logger));

// Create and setup application

$app = new Application();

$app['debug'] = $debug;
$app['exception_handler']->disable();
$app['cerberus'] = $errorHandler;

// Register services

$app->register(new TwigServiceProvider());

// Register simple error pages service

$app['error.response'] = $app->protect(function ($code) use ($app) {
    if ($app->offsetExists('twig')) {

        // 404.html, or 40x.html, or 4xx.html, or default.html
        $templates = array(
            'errors/'.$code.'.html',
            'errors/'.substr($code, 0, 2).'x.html',
            'errors/'.substr($code, 0, 1).'xx.html',
            'errors/default.html'
        );

        return new Response($app['twig']->resolveTemplate($templates)->render(array('code' => $code)), $code);
    } else {
        return new Response(sprintf("<h1>HTTP Error %s</h1>", $code), $code);
    }
});

// Register fatal error handler

$app['cerberus']->addHandler(function($message, $extra) use ($app) {

    if ($app['debug']) {
        return;
    }

    $app['cerberus']->emptyOutputBuffers();
    $response = $app['error.response'](500);

    return $response->send();
});

// Register application exception handler

$app->error(function (\Exception $e, $code) use ($app) {

    if (($code >= 500) && $app['debug']) {
        return;
    }

    return $app['error.response']($code);
});

// Setup routes

$app->get('/hello/{name}', function($name) use($app) {
    return 'Hello ' . $app->escape($name);
});

// Run application

$app->run();