Handler de errores global

QuietGuard\Monitor\ErrorHandler conecta los handlers globales de PHP para que un host PHP simple, sin pipeline de excepciones de framework, reporte igualmente los errores no capturados. Los frameworks (Laravel, Symfony) tienen sus propios hooks y no deben llamarlo.

Registro

ErrorHandler::register() es una única llamada estática que recibe un Reporter configurado:

php
use QuietGuard\Monitor\ErrorHandler;
use QuietGuard\Monitor\Reporter;

/** @var Reporter $reporter */
ErrorHandler::register($reporter);

Llámelo una vez, lo antes posible en su bootstrap, después de construir el Reporter.

Qué registra

register() cablea tres hooks globales:

  1. set_exception_handler: todo Throwable no capturado se envía mediante $reporter->reportException($e). El handler encadena: si otro handler de excepciones global estaba registrado antes de ErrorHandler::register(), sigue ejecutándose después de que la excepción se haya reportado (el monitor reporta primero y luego delega). Cuando no existe ningún handler previo, la excepción (mensaje, fichero:línea y stack trace) se escribe en error_log, igual que lo que el comportamiento por defecto de PHP habría registrado: instalar la monitorización nunca elimina, por tanto, el registro local del fallo en el host.
  2. set_error_handler: un error de PHP lanzado se encapsula en una ErrorException y luego se reporta. Comprueba primero error_reporting() & $severity, de modo que los valores suprimidos con @ o por debajo del nivel error_reporting actual se ignoran. A continuación devuelve false para que la gestión de errores normal de PHP se ejecute igualmente.
  3. register_shutdown_function: en el apagado, se inspecciona error_get_last() y, si se trata de un tipo fatal (E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR), se reporta una ErrorException. Esto captura las fatales que el handler de errores no puede interceptar.

Todos los caminos pasan por el Reporter, que nunca lanza excepciones: registrar estos handlers no puede, por tanto, romper el host.

Un bootstrap PHP mínimo

php
use QuietGuard\Monitor\Config;
use QuietGuard\Monitor\ErrorHandler;
use QuietGuard\Monitor\Reporter;
use QuietGuard\Monitor\Http\CurlHttpClient;
use QuietGuard\Monitor\Payload\ExceptionPayloadBuilder;
use QuietGuard\Monitor\Support\Scrubber;

require __DIR__.'/vendor/autoload.php';

$config = new Config(url: 'https://monitor.example.com', key: 'token-de-proyecto');

$reporter = new Reporter(
    config: $config,
    http: new CurlHttpClient(),
    scrubber: new Scrubber(['password', 'authorization']),
    builder: new ExceptionPayloadBuilder($config->traceLimit, $config->release),
);

ErrorHandler::register($reporter);

// A partir de aquí, las excepciones no capturadas, los errores de PHP y los
// errores fatales de apagado se transmiten automáticamente a Quiet Guard.
El SDK de Laravel, el bundle de Symfony y el plugin de WordPress no utilizan ErrorHandler: Laravel y Symfony conectan sus propios pipelines de excepciones, y el plugin de WordPress se integra con WordPress. Utilice ErrorHandler únicamente en un host que carezca de su propio pipeline de excepciones.

Está leyendo la documentación PHP Core v1.0.