Діагностика білого екрана (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-коду, що гарантує логування навіть при помилках у конфігурації Бітрікса.







