Белый экран в PHP обычно означает не мистику, а ошибку, которую сейчас не показывают в браузере. На локальной машине ошибки полезно включить, а на production их нужно писать в log и не светить пользователям. В этом уроке разберем безопасный порядок диагностики: error_reporting, display_errors, error_log, синтаксис, версия PHP и типичные причины
Цель — перестать обновлять страницу вслепую
Быстрая локальная диагностика
В начале учебного index.php можно временно включить:
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
Теперь PHP будет показывать ошибки в браузере. Это удобно локально, но на публичном сайте так делать нельзя: ошибки могут раскрыть пути файлов, настройки и детали кода
Специально ломаем код
Создайте файл:
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
echo 'Проверка'
echo 'Вторая строка';
Здесь пропущена точка с запятой после первой строки. PHP должен показать синтаксическую ошибку. Если вместо ошибки белая страница, значит отображение ошибок не включилось или запрос обрабатывает не тот PHP
error_log
На хостинге ошибки часто не показываются в браузере, но пишутся в log. Где именно лежит log, зависит от хостинга, панели управления, Docker-контейнера или сервера
Можно отправить свою запись:
error_log('Проверка записи в PHP error log');
Это помогает понять, куда пишет приложение и доходят ли сообщения до логов
В реальном проекте подробности ошибки лучше писать в log, а пользователю показывать спокойное сообщение
display_errors локально и на production
Локально:
ini_set('display_errors', '1');
error_reporting(E_ALL);
Production:
display_errors = Off
log_errors = On
Идея простая: разработчик должен видеть ошибки, пользователь — нет. Пользователь должен получить понятную страницу ошибки, а детали должны уйти в журнал
Типичные причины белого экрана
Синтаксическая ошибка. Пропущена ;, скобка, кавычка, закрывающий блок
Fatal error. Вызвана несуществующая функция, класс не найден, подключаемый файл отсутствует
Неверная версия PHP. Код использует синтаксис новой версии, а сервер запускает старую
Ошибка подключения к базе. PDO бросает исключение, но оно не выводится
Проблема с autoload. vendor/autoload.php не найден после переноса проекта
Порядок проверки
- Убедитесь, что редактируете правильный файл.
- Включите ошибки локально.
- Проверьте синтаксис:
php -l index.php
- Проверьте версию:
php -v
- Проверьте error log.
- Если проект с Composer, выполните:
composer install
- Если ошибка на хостинге, сравните локальную и серверную версии PHP.
php -l
Команда:
php -l index.php
проверяет синтаксис файла без запуска всего приложения. Это быстрый способ поймать пропущенную скобку или точку с запятой
Для нескольких файлов понадобится отдельный инструмент или IDE, но для первого расследования php -l очень полезен
Частые ошибки
Call to undefined function. Функция не существует, расширение не включено или файл с функцией не подключен
Class not found. Не подключен autoload, неверный namespace или пакет не установлен
Failed opening required. Путь к файлу неправильный. Используйте __DIR__, чтобы строить путь от текущего файла
Cannot modify header information. Вы пытаетесь вызвать header, setcookie или session_start после вывода HTML
Что может быть еще интересно по этой теме
Нужно ли всегда включать E_ALL? На разработке да, это помогает видеть предупреждения заранее. На production ошибки нужно логировать
Почему на хостинге белый экран, а локально все работает? Часто отличается версия PHP, расширения, путь к файлам или настройки отображения ошибок
Можно ли показывать ошибку пользователю? Технические детали — нет. Лучше показать нейтральное сообщение, а подробности записать в log
Что делать в WordPress? Проверять WP_DEBUG, WP_DEBUG_LOG и логи хостинга, но не оставлять отладку включенной публично без контроля
Что открыть дальше
- Composer в PHP: установка пакетов без ручного копирования — частая причина ошибок autoload.
- PHP и MySQL через PDO: первая база без SQL-инъекций — там важно видеть ошибки подключения.
- Сессии и cookies в PHP: логин без лишней магии — headers already sent часто всплывает именно там.
- Laravel: первый route и controller для новичка — Laravel покажет другой, более структурированный слой диагностики.



