kslimani / cerberus
PHP Error handler
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
Simple PHP error handler.
Registering
Add in composer.json
file :
{ "require": { "kslimani/cerberus": "~0.1.0" }, }
Usage
Quick setup :
error_reporting(-1); use Cerberus\ErrorHandler; use Cerberus\Handler\DebugHandler; $errorHandler = new ErrorHandler; $errorHandler->addHandler(new DebugHandler);
Cerberus come with a PSR-3 Logger Interface error handler :
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));
Callable can also be added as handler :
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 });
Error/exception details
Details array content differ according to error type.
Error :
[
'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',
]
Exception :
[
'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',
]
Note : HttpExceptionInterface
refer to Symfony\Component\HttpKernel\Exception\HttpExceptionInterface
.
Error handler priority
Error handlers are ordered by priority (from higher to lower values).
The first added handler get a priority value of 10, the second is 11, etc ...
Priority can be changed with setPriority()
method and must be set BEFORE adding handler.
DebugHandler
default priority value is0
(last handler)LoggerHandler
default priority value is100
(first handler)NewRelicHandler
default priority value is95
(after LoggerHandler)
Silex integration example
This Silex example application should handle all PHP errors :
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();