kslimani / cerberus
PHP 错误处理器
0.2.1
2015-11-09 15:04 UTC
Requires
- php: >=5.5.0
Requires (Dev)
- fabpot/php-cs-fixer: 1.*
- phpunit/phpunit: 5.*
- psr/log: ~1.0
- symfony/http-kernel: ~2.3,<2.7
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();