57 lines
1.2 KiB
PHP
57 lines
1.2 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Framework\ExceptionHandling;
|
|
|
|
use App\Framework\ErrorHandling\ErrorHandlerManager;
|
|
use App\Framework\ExceptionHandling\Strategy\StrictErrorPolicy;
|
|
use Error;
|
|
|
|
final readonly class ShutdownHandler
|
|
{
|
|
private const array FATAL_TYPES = [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR];
|
|
|
|
public function handle(): void
|
|
{
|
|
$last = error_get_last();
|
|
|
|
if (!$last || !$this->isFatalError($last['type'])) {
|
|
return;
|
|
}
|
|
|
|
$this->cleanOutputBuffer();
|
|
|
|
$file = (string)($last['file'] ?? 'unknown');
|
|
$line = (int)($last['line'] ?? 0);
|
|
|
|
$error = new Error($last['message'] ?? 'Fatal error',0);
|
|
|
|
|
|
|
|
try {
|
|
$ehm = new ErrorKernel();
|
|
$ehm->handle($error, ['file' => $file, 'line' => $line]);
|
|
} catch (\Throwable) {
|
|
|
|
}
|
|
|
|
exit(255);
|
|
}
|
|
|
|
private function cleanOutputBuffer(): void
|
|
{
|
|
try {
|
|
while (ob_get_level() > 0) {
|
|
@ob_end_clean();
|
|
}
|
|
} catch (\Throwable) {
|
|
// ignore
|
|
}
|
|
}
|
|
|
|
private function isFatalError(?int $type = null): bool
|
|
{
|
|
return in_array($type ?? 0, self::FATAL_TYPES, true);
|
|
}
|
|
}
|