Error handler with PSR-7 support.
The Jasny Error Handler package is available on packagist. Install it using composer:
composer require jasny/error-handler
$errorHandler = new Jasny\ErrorHandler();
Just creating an error handler will do nothing. You can use it for logging, handling fatal errors and as PSR-7 compatible middleware.
By default the error handler with only catch Throwables and not set the php error handler.
To log errors, set the logger using setLogger()
. You can log with any PSR-3 compatible
logger like Monolog.
The logUncaught()
method will set the error handler, so warnings and notices can be logged. It may also register a
shutdown function to handle uncatchable fatal
errors.
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$errorHandler = new Jasny\ErrorHandler();
$log = new Logger('test');
$log->pushHandler(new StreamHandler('path/to/your.log'));
// Log fatal errors, warnings and uncaught exceptions
$errorHandler->setLogger($log);
$errorHandler->logUncaught(E_PARSE | E_ERROR | E_WARNING | E_USER_WARNING);
$errorHandler->logUncaught(Exception::class);
$errorHandler->logUncaught(Error::class); // PHP7 only
The error handler can be used as PSR-7 compatible (double-pass) middleware.
The error will catch Exceptions and Errors.
You can use this middleware with:
For example use it with Relay:
use Relay\RelayBuilder;
use Jasny\HttpMessage\ServerRequest;
use Jasny\HttpMessage\Response;
$errorHandler = new Jasny\ErrorHandler();
$relay = new RelayBuilder();
$dispatcher = $relay->newInstance([$errorHandler->asMiddleware()]);
$response = $dispatcher((new ServerRequest())->withGlobalEnvironment(), new Response());
Or with Jasny Router:
use Jasny\Router;
use Jasny\Router\Routes\Glob as Routes;
use Jasny\HttpMessage\ServerRequest;
use Jasny\HttpMessage\Response;
$router = new Router(new Routes(['/**' => ['controller' => '$1', 'id' => '$2']));
$errorHandler = new Jasny\ErrorHandler();
$router->add($errorHandler->asMiddleware());
$response = $dispatcher((new ServerRequest())->withGlobalEnvironment(), new Response());
With PHP 5 errors aren't thrown, so the middleware won't handle it. To add middleware support for errors in PHP5, you
should call converErrorsToExceptions()
. This method will convert an error to an
ErrorException.
Errors that are not thrown, like syntax errors, are not caught and will cause a fatal error. With the logUncaught()
method, you can specify that the error handler should also these kind of errors.
With the onFatalError()
method you take additional action, like output a pretty error message.
ob_start();
$errorHandler = new Jasny\ErrorHandler();
$errorHandler->logUncaught(E_ERROR | E_RECOVERABLE_ERROR | E_USER_ERROR);
$errorHandler->onFatalError(function() {
http_response_code(500);
header('Content-Type: text/html');
echo "<h1>An unexpected error occured</h1><p>The error has been logged.</p>";
}, true);
Use true
as second argument of onFatalError
to the output buffer before calling your function.
Using the error logger might lose backtrace information that other error handlers can pick up. Jasny Error Handler will always call the previous error handler, including the PHP internal error handler for non-thrown errors.
When using Rollbar you should not use the Rollbar handler for Monolog. By using Rollbar's own error handler, you'll get better error reports:
use Jasny\ErrorHandler;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
// Rollbar error handler will log uncaught errors
Rollbar::init(array('access_token' => 'POST_SERVER_ITEM_ACCESS_TOKEN'));
$log = new Logger('test');
$log->pushHandler(new RollbarHandler(Rollbar::$instance));
$errorHandler = new ErrorHandler();
// Jasny error handler will only log caught errors
$errorHandler->setLogger($log);