Глиф Учебники

Как включить вывод ошибок в PHP

Справочник · PHP · 3 минуты чтения

Быстрый способ на время отладки — три строки в самом начале файла, сразу после <?php:

PHP
<?php
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);

display_errors включает показ ошибок на странице, error_reporting(E_ALL) — показ всех видов: фатальных ошибок, предупреждений, уведомлений об устаревшем коде.

У этого способа есть предел: он не покажет синтаксическую ошибку (Parse error) в том же файле. Файл с такой ошибкой PHP не может даже начать выполнять, поэтому до ini_set дело не доходит. Для неё есть проверка из терминала:

Bash
php -l index.php

Если ошибок нет, команда ответит No syntax errors detected in index.php, иначе — покажет ошибку и номер строки.

Надёжно: в настройках PHP

Где менять настройки, зависит от доступа к файлу настроек php.ini: на своём компьютере и своём сервере он есть, на обычном хостинге — чаще нет.

Есть доступ к php.iniсвой компьютер или сервер

В файле php.ini найдите и поправьте строки:

Настройки
display_errors = On
display_startup_errors = On
error_reporting = E_ALL
log_errors = On

Где лежит действующий php.ini, показывает команда php --ini (строка Loaded Configuration File). Но это файл для терминала. У веб-сервера он может быть свой: в Ubuntu и Debian это /etc/php/8.3/apache2/php.ini для Apache и /etc/php/8.3/fpm/php.ini для PHP-FPM — отдельной службы, которая выполняет PHP для веб-сервера (вместо 8.3 — ваша версия). Точно узнать можно функцией phpinfo() на странице сайта — строка «Loaded Configuration File».

После правки перезапустите то, что выполняет PHP: встроенный сервер (Ctrl+C и запуск заново), Apache (sudo systemctl restart apache2) или PHP-FPM (sudo systemctl restart php8.3-fpm).

Дальше: «Где журнал ошибок»

Хостинг без доступа к php.iniпанель или .user.ini

Подойдёт то, что есть на вашем хостинге:

  • в панели управления хостингом часто есть раздел настроек PHP с переключателем display_errors;
  • при PHP-FPM (отдельная служба, которая выполняет PHP для веб-сервера) настройки задают файлом .user.ini в корне сайта — теми же строками, что в php.ini: display_errors = On, error_reporting = E_ALL; PHP перечитывает его не сразу, а примерно раз в 5 минут;
  • строка php_flag display_errors on в .htaccess работает, только если PHP подключён к Apache модулем; если Apache передаёт файлы в PHP-FPM, эта строка сама вызовет ошибку 500, а nginx файл .htaccess не читает вовсе.

Где журнал ошибок

Даже при выключенном показе ошибки пишутся в журнал (при log_errors = On). Путь задаёт настройка error_log; если она пуста, сообщения попадают в журнал веб-сервера: у Apache в Ubuntu — /var/log/apache2/error.log, у nginx — /var/log/nginx/error.log. Встроенный сервер и запуск в терминале выводят ошибки прямо в окно терминала.

Последние строки журнала удобно смотреть так:

Bash
sudo tail -n 50 /var/log/apache2/error.log

На рабочем сайте выключайте показ ошибок (display_errors = Off) и оставляйте только журнал. Текст ошибки выдаёт посетителю пути к файлам, имена баз и куски SQL-запросов — всё это помогает взломщику.

Если ошибок всё равно не видно