Как включить вывод ошибок в 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 дело не доходит. Для неё есть проверка из терминала:
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. Встроенный сервер и запуск в терминале выводят ошибки прямо в окно терминала.
Последние строки журнала удобно смотреть так:
sudo tail -n 50 /var/log/apache2/error.logНа рабочем сайте выключайте показ ошибок (display_errors = Off) и оставляйте только журнал. Текст ошибки выдаёт посетителю пути к файлам, имена баз и куски SQL-запросов — всё это помогает взломщику.
Если ошибок всё равно не видно
- Страница пустая, а в журнале пусто — проверьте, тот ли
php.iniправился: у терминала и веб-сервера они разные. - В коде где-то стоит
error_reporting(0)или знак@перед вызовом функции — он глушит ошибки этой строки. - Ошибка 500 без строк в журнале PHP — смотрите журнал веб-сервера: причина может быть в его настройках или в
.htaccess.