Где искать логи 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. Логирование в файл, наоборот, должно быть включено всегда, даже на проде.
Разбор типового фатала: 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. Строка говорит, что скрипту не хватило памяти именно в момент попытки выделить ещё 20 килобайт, а не в целом.
Первый шаг — не поднимать memory_limit вслепую, а открыть файл на указанной строке и понять, что там происходит: чаще всего это загрузка всего результата запроса в массив или обработка файла целиком вместо чтения по частям. Если скрипт запускается из cron, разница в лимитах между CLI и FPM разобрана в статье про PHP в cron и отличия CLI от FPM.
Уровни 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 на проде.
- Для каждого фатала из лога есть привязка к файлу и строке, а не только к тексту ошибки.