К основному содержимому

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

PHP · 29.09.2026

Где искать логи 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 на проде.
  • Для каждого фатала из лога есть привязка к файлу и строке, а не только к тексту ошибки.
← Назад в базу знаний Задать вопрос поддержке