# Логи PHP: error_log, display_errors и разбор фаталов

> Логи PHP на практике: где искать error_log, чем display_errors отличается от log_errors и как разобрать типовой фатал по строке лога.

## Где искать логи PHP: error\_log и путь к файлу

PHP пишет сообщения об ошибках туда, куда указывает директива error\_log в php.ini или в конфиге пула PHP-FPM. Узнать точный путь можно без правки файлов — команда php -i покажет реальное значение, которое использует интерпретатор прямо сейчас.

```
php -i | grep error_log
```

Для сайтов на Nginx и PHP-FPM типичный путь — /var/log/php8.3-fpm.log для ошибок самого пула и отдельный error\_log внутри блока pool для ошибок конкретного сайта. Если директива error\_log не задана явно, PHP-FPM пишет в общий системный лог, и найти там ошибку одного сайта среди сотен чужих строк тяжело.

## display\_errors и log\_errors: разные задачи

display\_errors выводит текст ошибки прямо в HTML-страницу, log\_errors пишет её в файл. На продакшене эти директивы должны работать в противоположных режимах.

```
display_errors = Off
log_errors = On
error_log = /var/log/php/app-error.log
```

Показ ошибок в браузере — это утечка информации о путях, версиях библиотек и структуре базы данных, что напрямую относится к теме статьи [о безопасности PHP через настройки php.ini](https://www.zevshost.net/ru/kb/php-security-hardening-ini/). Логирование в файл, наоборот, должно быть включено всегда, даже на проде.

## Разбор типового фатала: Allowed memory size exhausted

Строка из лога выглядит так: PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes) in /var/www/app/import.php on line 84. Число 134217728 байт — это 128 мегабайт, значение [memory\_limit](https://www.zevshost.net/ru/kb/php-ini-memory-upload-limits/). Строка говорит, что скрипту не хватило памяти именно в момент попытки выделить ещё 20 килобайт, а не в целом.

Первый шаг — не поднимать memory\_limit вслепую, а открыть файл на указанной строке и понять, что там происходит: чаще всего это загрузка всего результата запроса в массив или обработка файла целиком вместо чтения по частям. Если скрипт запускается из cron, разница в лимитах между CLI и FPM разобрана в статье [про PHP в cron и отличия CLI от FPM](https://www.zevshost.net/ru/kb/php-cli-vs-fpm-cron/).

## Уровни error\_reporting: что означают константы

| Константа | Что ловит | Стоит включать на проде |
| --- | --- | --- |
| E\_ERROR | Фатальные ошибки, скрипт остановлен | да |
| E\_WARNING | Некритичные ошибки выполнения | да, в лог |
| E\_DEPRECATED | Устаревшие конструкции языка | да, в лог |
| E\_NOTICE | Обращение к неинициализированной переменной | по желанию |
| E\_STRICT | Рекомендации по стилю кода | нет, шумно |

Для продакшена типичное значение — error\_reporting(E\_ALL & ~E\_DEPRECATED & ~E\_STRICT), а вывод из этого набора всегда идёт в error\_log, а не на экран.

## Частые записи в логе и что они означают

- PHP Parse error: syntax error, unexpected token — ошибка в самом коде, скрипт не запустился вообще, деплой сломан.
- PHP Fatal error: Uncaught Error: Call to a member function on null — обращение к методу объекта, который не был создан, чаще всего из-за неудачного запроса к базе.
- PHP Warning: file\_put\_contents failed to open stream — не хватает прав на запись в каталог или каталог не существует.
- PHP Deprecated: Implicit conversion from float to int loses precision — код доживает свой век и требует правки перед следующим обновлением PHP.
- PHP Fatal error: Maximum execution time exceeded — скрипт упёрся в max\_execution\_time, а не в memory\_limit, лечится иначе.

## Итог: чек-лист настройки логирования PHP

- display\_errors = Off и log\_errors = On заданы отдельно для веб-режима и для CLI.
- error\_log указывает на конкретный файл сайта, а не на общий системный лог.
- Ротация лог-файла настроена через logrotate, чтобы диск не заполнился за месяц.
- error\_reporting включает E\_ALL без E\_DEPRECATED и E\_STRICT на проде.
- Для каждого фатала из лога есть привязка к файлу и строке, а не только к тексту ошибки.

---

Источник: https://www.zevshost.net/ru/kb/php-logi-oshibok-razbor/
