Диагностика белого экрана (WSOD) на 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Диагностика белого экрана (WSOD) на 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Диагностика белого экрана (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.confphp_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-кода, что гарантирует логирование даже при ошибках в конфигурации Битрикс.