Как правильно логировать ошибки в PHP?

Как настроить логирование всех типов ошибок в PHP, включая ошибки синтаксиса, используя класс ErrorHandler?
  • 4 декабря 2023 г. 12:02
Ответы на вопрос 2
Для эффективного логирования ошибок в PHP, следует выполнить несколько шагов:

1. Настройте файл `php.ini` (или используйте функции `ini_set()` в скрипте) для записи ошибок в журнал. Убедитесь, что директивы `log_errors` и `error_log` заданы правильно:

```ini
log_errors = On
error_log = /path/to/your/error.log
```

Вы также можете настроить уровень сообщений об ошибках, который будет журналироваться, используя директиву `error_reporting`:

```ini
error_reporting = E_ALL
```

2. Определите класс `ErrorHandler` с методами для обработки ошибок и исключений. Например:

```php
class ErrorHandler {

    public function handleError($severity, $message, $file, $line) {
        throw new ErrorException($message, 0, $severity, $file, $line);
    }

    public function handleException($exception) {
        error_log($exception->__toString());
        
        // Здесь можно добавить логику, например, вывод пользовательской ошибки или отправку уведомления
    }

    public function handleShutdown() {
        $error = error_get_last();
        
        if ($error !== NULL) {
            $this->handleError(
                $error['type'],
                $error['message'],
                $error['file'],
                $error['line']);
        }
    }
}
```

3. Установите обработчики с помощью `set_error_handler()`, `set_exception_handler()` и `register_shutdown_function()`:

```php
$handler = new ErrorHandler();

set_error_handler([$handler, 'handleError']);
set_exception_handler([$handler, 'handleException']);
register_shutdown_function([$handler, 'handleShutdown']);
```

Теперь любые ошибки будут преобразованы в `ErrorException` благодаря `handleError`, что позволяет ловить их как исключения. Неперехваченные исключения будут логироваться через `handleException`, а фатальные ошибки (включая синтаксические) — через `handleShutdown`, поскольку такие ошибки не могут быть перехвачены с помощью `set_error_handler()`.

Ошибки синтаксиса не могут быть перехвачены во время исполнения, поскольку они возникают на этапе компиляции перед выполнением скрипта. Однако, если ошибка синтаксиса приведет к фатальной ошибке, информация о ней будет доступна через `error_get_last()` в функции, зарегистрированной через `register_shutdown_function()`.

Убедитесь, что путь к лог-файлу в `error_log` доступен для записи веб-сервером и сохраняйте этот путь в безопасности, чтобы его не могли просмотреть посторонние.
Не получится, синтаксические ошибки не отловить, так как они появляются до запуска скрипта на выполнение.Но если перед запуском приложения выполнить php с ключом -l (--syntax-check) то приложение не будет запущено а только пройдет проверка на ошибки и при наличии она будет выведена, ее можно прочитатьexec('php --syntax-check main.php',$error_str);p.s. если исходные тексты у вас не генерируются в процессе работы программы, синтаксическую проверку лучше проводить заранее однократно, а не в процессе работы всего приложения.
Похожие вопросы