Диагностика белого экрана (WSOD) на 1С-Битрикс
Белый экран (White Screen of Death) — пустая страница без контента, без ошибок, без HTML. Браузер получает пустое тело ответа с HTTP-статусом 200 или 500. Отличие от обычной ошибки 500: сервер не отдаёт даже стандартную страницу ошибки. Для Битрикс это означает, что PHP-процесс умер или прервался до отправки какого-либо вывода. Причину найти сложнее всего, потому что по умолчанию ничего не логируется.
Механика появления WSOD
PHP-интерпретатор при фатальной ошибке (E_ERROR, E_PARSE, E_COMPILE_ERROR) прекращает выполнение скрипта. Если display_errors = Off (а на продакшене так и должно быть), вывода нет. Если log_errors = Off или путь к логу некорректен — записи тоже нет. Результат: пустой ответ.
Битрикс усугубляет проблему буферизацией вывода. Ядро использует ob_start() на ранних этапах инициализации для реализации отложенных функций и композитного кэша. Если ошибка происходит внутри буфера, который не был сброшен — клиент не получает ничего, даже частичного HTML.
Пошаговая диагностика
1. Проверьте PHP error log.
Это первое и самое важное действие. Определите путь:
-
php -i | grep error_log— для CLI -
phpinfo()— для web (создайте временный файл) - Конфиг пула php-fpm:
/etc/php-fpm.d/www.conf→php_admin_value[error_log]
Если лог пуст — убедитесь, что log_errors = On и путь к файлу доступен для записи пользователю, от которого работает php-fpm (обычно www-data или nginx).
2. Временно включите вывод ошибок.
Добавьте в самое начало index.php, до любых include:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Если после этого появилась ошибка — вы получили диагноз. Типичные сообщения:
-
Parse error: syntax error— битый PHP-файл -
Fatal error: Class 'CBitrixComponent' not found— повреждение ядра -
Fatal error: Allowed memory size exhausted— нехватка памяти
Если экран по-прежнему белый — ошибка происходит до выполнения вашего кода (на этапе загрузки расширений PHP) или процесс убивается OOM-killer'ом.
3. Проверьте системные логи.
dmesg | grep -i "oom\|kill\|segfault"
journalctl -u php-fpm --since "1 hour ago"
Segfault в PHP-процессе — это баг в расширении (часто ionCube, Zend Guard, устаревший opcache). OOM — нехватка RAM.
4. Минимальный тест ядра.
Создайте файл /test_kernel.php:
<?php
echo "Step 1: PHP works\n";
require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php';
echo "Step 2: Kernel loaded\n";
Результаты:
- Пусто — PHP не может выполнить даже echo. Проблема на уровне сервера или PHP-конфигурации.
- «Step 1» — ядро Битрикс не загружается. Проблема в
dbconn.php,.settings.phpили подключении к БД. - «Step 1» и «Step 2» — ядро загружается, проблема в конкретной странице/компоненте.
Основные причины WSOD в Битрикс
Ошибка в init.php. Этот файл выполняется при каждом запросе. Fatal error в нём — гарантированный WSOD по всему сайту. Быстрая проверка: переименуйте файл. Быстрый фикс: найдите строку ошибки через php -l /bitrix/php_interface/init.php (проверка синтаксиса).
Повреждение кэша opcache. Zend OPcache кэширует скомпилированный байткод. Если кэш повреждён (крэш во время записи, смена версии PHP без сброса) — PHP загружает битый байткод и падает без сообщений. Решение: перезапуск php-fpm (systemctl restart php-fpm) сбрасывает opcache. Для надёжности: opcache.validate_timestamps = 1 и opcache.revalidate_freq = 2.
Несовместимость версии PHP. Обновление PHP с 7.4 на 8.0 ломает сайты, использующие удалённые функции: each(), create_function(), mysql_*. При этом Битрикс может загрузиться, но сторонний модуль вызовет Fatal Error. Проверяйте совместимость заранее через php -l для всех файлов проекта.
Зацикленный редирект с пустым телом. Модуль main перенаправляет по правилам из b_urlrewrite. Если правило создаёт цикл (A → B → A), nginx/Apache может прервать запрос, отдав пустой ответ. Проверяйте заголовки через curl -v -L URL и считайте редиректы.
Повреждение файлов ядра. Незавершённое обновление, ручное редактирование файлов ядра, вирус — всё это может привести к partial-загрузке. Инструмент проверки целостности: /bitrix/admin/site_checker.php → «Проверка файлов ядра». Если сайт не грузится совсем — восстановите ядро из резервной копии или скачайте свежую версию с 1c-bitrix.ru и замените /bitrix/modules/ и /bitrix/components/.
Таблица сроков диагностики
| Причина | Время диагностики | Время устранения |
|---|---|---|
| Ошибка в init.php | 15-30 минут | 30-60 минут |
| Исчерпание memory_limit | 30 минут | 5 минут (настройка) |
| Повреждение opcache | 10 минут | 5 минут (рестарт) |
| Несовместимость PHP-версии | 1-2 часа | 2-8 часов (откат или адаптация) |
| Повреждение ядра | 1-3 часа | 2-4 часа (восстановление) |
| Segfault в PHP-расширении | 2-4 часа | 1-8 часов (замена/обновление расширения) |
Предотвращение
Настройте exception_handling в .settings.php с обязательной записью в файл. Добавьте в конфиг php-fpm: php_admin_value[log_errors] = On, php_admin_value[error_log] = /var/log/php/bitrix-error.log. Эти настройки нельзя переопределить из PHP-кода, что гарантирует логирование даже при ошибках в конфигурации Битрикс.







