# Логи 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/uk/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/uk/kb/php-ini-memory-upload-limits/). Рядок каже, що скрипту не вистачило пам'яті саме в момент спроби виділити ще 20 кілобайтів, а не загалом.

Перший крок — не піднімати memory\_limit наосліп, а відкрити файл на вказаному рядку і зрозуміти, що там відбувається: найчастіше це завантаження всього результату запиту в масив або обробка файлу цілком замість читання частинами. Якщо скрипт запускається з cron, різниця в лімітах між CLI і FPM розібрана у статті [про PHP у cron і відмінності CLI від FPM](https://www.zevshost.net/uk/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/uk/kb/php-logi-oshibok-razbor/
