Handler d'erreurs global

QuietGuard\Monitor\ErrorHandler branche les handlers globaux de PHP afin qu'un hôte PHP simple, sans pipeline d'exceptions de framework, remonte tout de même les erreurs non capturées. Les frameworks (Laravel, Symfony) ont leurs propres hooks et ne doivent pas l'appeler.

Enregistrement

ErrorHandler::register() est un unique appel statique qui prend un Reporter configuré :

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

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

Appelez-le une fois, le plus tôt possible dans votre bootstrap, après la construction du Reporter.

Ce qu'il enregistre

register() câble trois hooks globaux :

  1. set_exception_handler, tout Throwable non capturé est envoyé via $reporter->reportException($e). Le handler chaîne : si un autre handler d'exceptions global était enregistré avant ErrorHandler::register(), il s'exécute toujours après que l'exception a été remontée (le monitoring remonte d'abord, puis délègue). En l'absence de handler précédent, l'exception (message, fichier:ligne et stack trace) est écrite dans error_log, à l'identique de ce que le comportement par défaut de PHP aurait consigné : installer le monitoring ne supprime donc jamais la trace locale du crash côté hôte.
  2. set_error_handler, une erreur PHP levée est encapsulée dans une ErrorException puis remontée. Il vérifie d'abord error_reporting() & $severity, de sorte que les valeurs supprimées par @ ou en dessous du niveau error_reporting courant sont ignorées. Il renvoie ensuite false pour que la gestion d'erreurs normale de PHP s'exécute quand même.
  3. register_shutdown_function, à l'arrêt, error_get_last() est inspecté et, s'il s'agit d'un type fatal (E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR), une ErrorException est remontée. Cela capture les fatales que le handler d'erreurs ne peut pas intercepter.

Tous les chemins passent par le Reporter, qui ne lève jamais d'exception : enregistrer ces handlers ne peut donc pas casser l'hôte.

Un bootstrap PHP minimal

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: 'jeton-projet');

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

ErrorHandler::register($reporter);

// À partir d'ici, les exceptions non capturées, les erreurs PHP et les erreurs
// fatales d'arrêt sont transmises automatiquement à Quiet Guard.
Le SDK Laravel, le bundle Symfony et le plugin WordPress n'utilisent pas ErrorHandler : Laravel et Symfony branchent leurs propres pipelines d'exceptions, et le plugin WordPress s'intègre à WordPress. N'utilisez ErrorHandler que dans un hôte dépourvu de son propre pipeline d'exceptions.

Vous lisez la documentation PHP Core v1.0.