Тайна “белого экрана”

7480

Вместо вступления

Написать этот пост следовало давно, не доходили руки. Но прочитав очередное сообщение на форуме про “всё пропало, белый экран” я решил что наконец пора.

Речь пойдет о том самом “белом экране”, “белой странице” или “пустой странице”, поражающей своей загадочностью многих начинающих веб-энтузиастов.

Провести несколько минут за чтением этого поста крайне желательно и полезно, в первую очередь для вас самих. Ниже подробно расскажу почему. Да, текста довольно много и вы потратите некоторое время на чтение, но зато в экстренной ситуации сможете гарантированно сохранить в разы больше времени и нервов в ожидании помощи. Вам решать, стоит ли оно того.

И да, я знаю что этот вопрос давно описан в интернете со всех возможных сторон, но когда это кого-то волновало, не правда ли?

Немного теории

И так, что же такое “белый экран”? Это чистая страница в браузере, показываемая в случае когда сервер не вернул никакого HTML-кода для отображения пользователю. Скрипты, написанные на PHP (или других серверных языках, но рассматривать будем только PHP, т.к.InstantCMS написана на нём) работают по одной схеме которую важно понимать если вы планируете достичь каких-либо успехов в создании динамических сайтов (неважно, на CMS или без).

В чем принципиальное отличие статичного сайта и динамического, работающего на движке? Главное отличие в том, откуда берутся HTML-страницы, наполняющие сайт. Для статичного сайта страницы это просто набор готовых HTML-файлов, лежащих в папке на сервере. Открывая страницу в браузере мы открываем один из этих файлов. Всё просто. В случае же с CMS на сервере не хранятся готовые HTML-страницы. Вместо них там лежит программа, которая эти страницы создает “на лету”. То есть, когда мы открываем URL в браузере, на самом деле мы запускаем эту программу (CMS), она генерирует HTML-код страницы и отправляет его нам. Мы видим результат работы программы. Это позволяет нам влиять на внешний вид всех страниц сайта одновременно, лишь изменив настройки программы-генератора. Поставив пару галочек в админке, например.

Минус заключается в том, что любая программа может давать сбои. Они могут быть вызваны как ошибками в коде программы так и неверными настройками. Если в программе происходит сбой который она не может пережить, то генерация страницы обрывается и браузеру посылается пустой ответ вместо HTML-кода. В результате мы видим тот самый “белый экран”.

Проблема

Когда неопытный пользователь получает “белый экран” он идет на форум и задаёт вопрос как это исправить. Но проблема в том, что одних слов про “белый экран” недостаточно чтобы хоть как-то помочь. Сам по себе “белый экран” ни говорит абсолютно ни о чем, кроме самого факта наличия проблемы. Это как написать на автофоруме “машина не заводится, как исправить?”. Причин появления фатальной ошибки может быть огромное множество и без подробностей невозможно установить верную. Только если прибегнуть к телепатии.

Решение

В современных автомобилях есть диагностический разъем для подключения компьютера. И когда машина не заводится мастер первым делом подключает свой ноутбук к этому разъему и смотрит код ошибки, который сразу же указывает на неисправный узел и избавляет от необходимости перебирать весь двигатель в поисках поломки.

То же самое можно сделать и в нашем случае. Главный тезис, который стоит запомнить: если вы видите “белый экран” в браузере, значит в CMS произошла фатальная ошибка. И чтобы узнать где именно она произошла необходимо получить ее код (в случае с PHP - текст ошибки).

Если при сообщении о “белом экране” на форуме вы будете прикладывать полный текст ошибки, шансы на получение помощи или дельного совета возрастут на 435%*. Возвращаясь к аналогии с автомобилями, вместо “машина не заводится” вы будете писать “машина не заводится, показывает ошибку в цепи питания бензонасоса”.

Получаем текст ошибки

InstantCMS может показывать “белый экран” в двух случаях. Метод получения текста ошибки отличается для каждого из них. Поскольку заранее обычно неизвестно какой из этих случаев произошел именно сейчас всегда следует проверять их оба, по-очереди.

1. Произошла ошибка в запросе к базе данных

Движок хранит весь контент сайта в базе данных, с которой общается посредством SQL запросов. Неверно составленный запрос может привести к ошибке, прерывающей дальнейшее выполнение. В InstantCMS встроен механизм отладки, который позволяет получить текст такой ошибки. Включается он в админке:

InstantCMS 1.x: Админка - Настройки - Сайт - Включить режим отладки
InstantCMS 2.x: Админка - Настройки - Отладка - Включить режим отладки

После того как режим отладки включен, вернитесь на страницу с “белым экраном” и обновите ее. Если появится сообщение и текст SQL запроса - это то, что вам нужно. Если нет, значит причина не здесь, переходим к п.2.

2. Произошла фатальная ошибка PHP

Это означает что где-то в коде движка есть баг, который не дает ему обработать ваш запрос. Выполнение программы прерывает сам интерпретатор PHP и он прекрасно знает в каком файле и на какой строке ему пришлось это сделать. Вам остается только получить эту информацию. Сделать это можно, опять же, несколькими способами. Некоторые из них могут не работать на вашем сервере/хостинге.

Способ 1. Смотрим логи
На каждом уважающем себя хостинге ведутся логи (журнал) ошибок PHP, куда попадают все ошибки. Лог представляет из себя обычный текстовый файл, который называется error.log, ваш-домен-error.log или как-то похоже. Вы всегда можете уточнить расположение и название лога в поддержке вашего хостинга.

Внутри лога обычно бывает куча записей (строк), поэтому нужно еще найти нужную. Проще всего сделать это так. Открываете лог, смотрите в самый конец, запоминаете. Возвращаетесь на сайт, обновляете страницу с “белым экраном” (т.е. заставляете ошибку произойти еще раз). Возвращаетесь в лог, смотрите что добавлено.

Каждая строка в логе выглядит примерно так:

[Sun May 10 03:58:53 2015] [error] [client 95.189.59.42] PHP: Fatal Error: Allowed Memory Size of 8388608 Bytes Exhausted

или так:

[Mon May 11 22:02:50 2015] [error] [client 93.74.168.150] PHP Notice: Array to string conversion in /var/www/index.php on line 27

Вас интересуют строки с “PHP Fatal Error”, потому что только этот тип ошибок приводит к “белому экрану”. Ищите именно их. Можно, также, ориентироваться по дате и времени в начале каждой записи.

Способ 2. Включаем вывод ошибок в браузер
Помимо записи в лог PHP также может показывать текст ошибки прямо в браузере. Это удобно, но небезопасно (злодеи не должны видеть тексты ваших ошибок, т.к. из них теоретически можно почерпнуть полезную для взлома информацию), поэтому вывод ошибок в браузер на нормальных хостингах обычно отключен.

Вы можете временно включить вывод ошибок добавив в начало файла .htaccess в корне сайта следующую строку:

Код PHP:
  1. php_flag display_errors on
Если это не помогло (вы обновили страницу с ошибкой но текста по-прежнему нет) и у вас есть доступ к файлу php.ini на сервере, то вы можете включить директиву display_errors внутри этого файла. Потребуется перезапуск веб-сервера для того, чтобы изменения применилсь.

Способ 3. Поддержка хостинга
Если вы убедились что проблема не в SQL запросе (включение режима отладки в админке не показало текст ошибки на проблемной странице), а найти логи или включить вывод ошибок не получается - смело обращайтесь в поддержку хостера. Скажите им что вы получили фатальную ошибку PHP и вам нужен ее текст. Они должны объяснить где этот текст можно найти.

Вместо заключения

Я рад, что вы дочитали до этого места. Но вы, строго говоря, должны быть рады гораздо больше меня. Ведь теперь вы знаете как сэкономить кучу времени задавая вопрос на форуме в критической ситуации и предоставляя все необходимые подробности сразу, а не после чьей-либо просьбы.

Спасибо за внимание и удачи в сайтостроительстве!
Новогодняя распродажа 2014! | Летняя распродажа 2015!
Теги: ошибка, php
Комментарии (28)
Loadырь 13 мая 2015 в 13:32 +20
small user social cms
Спасибо r2, осталось дело за малым - всегда держать эту статью первой в списке. Так сказать в ТОПе. smile
Luxin 13 мая 2015 в 13:35 +2
small user social cms
+ Для начинающих то, что нужно!
“пустой странице”, поражающей своей загадочностью многих начинающих веб-энтузиастов.
И да, я знаю что этот вопрос давно описан в интернете со всех возможных сторон
Начинающему трудно связать то, что написано в интернете с данной цмс.
Алексей 13 мая 2015 в 13:43 +1
small user social cms
Замечательно ! Спасибо, r2.
На мой взгляд, взгляд начинающего веб-энтузиаста, в комментариях к этой публикации будет уместно увидеть распространенные ситуации (проблемы) и способы их решения.
Юрий 13 мая 2015 в 16:35 +1
small user social cms
Благодарю и беру на вооружение, хотя с белым экраном сталкивался только один раз на 1.9 при попытке установить плагин ( не помню какой )
Александр 14 мая 2015 в 11:40 +1
small user social cms
Очень классно всё раписано +5

P.S.
jorgovich 15 мая 2015 в 20:40 0
small user social cms
r2, все здорово спасибо, но еще бы тайну настройки сервака под инстант бы еще раскрыть smile , хотя бы на уровне какие базовые модули и настройки php сделать, мне кажется меньше было бы белых экранов..
Aquarius 3 июля 2015 в 01:28 0
small user social cms
jorgovich:
...хотя бы на уровне какие базовые модули и настройки php сделать, мне кажется меньше было бы белых экранов
Не было бы меньше, jorgovich...
Потому что обе ветки давно заточены под самый стандартный хостинг, а скрипт установки ещё и дополнительно проверяет, что все эти (теперь обычнейшие) условия выполнены.
Если у вас из-за «сервака» глючит сайт, лучше просто найдите нормальный сервак scratch
Луганчанин 26 августа 2015 в 08:58 0
small user social cms
После смены шаблона в двойке "всё пропало" и админка и сайт. Это лечится?
Луганчанин 26 августа 2015 в 08:59 0
small user social cms
Это я о локальной версии.
byb 26 августа 2015 в 09:09 +1
small user social cms
Лечится, сам все свое начало через белый экран прошел. Шаблон назад меняли в конфиге?
Луганчанин 26 августа 2015 в 09:12 0
small user social cms
Спасибо. Уже и сам дошел до этого решения. Помогло.
Луганчанин 26 августа 2015 в 09:13 0
small user social cms
Но это не решение проблемы с установкой именно этого шаблона.
a1xzhu 27 июня 2016 в 14:50 0
small user social cms
Помогите пожалуйста или направьте в более нужном направлении, я понимаю что ошибка где то кроеться возможо в моих изменения с движком, но когда обновляюсь с версии 2.1.2 до 2.2.0 белый экран везде, делаю обновление в ручном режиме, заливаю из папки файлы в корень сайта и все сразу белый экран, до этого делал все меня тему по умолчанию виджеты иные убирал, не помогает.
Кирилл Эдуардович (Странник) 27 июня 2016 в 16:02 0
small user social cms
Вы хоть внимательно прочитайте текст, который для Вас написал r2. А то вы задаете вопросы, на которые уже есть ответы.
a1xzhu 28 июня 2016 в 07:28 0
small user social cms
Я это все понимаю, но у меня не хватает видимо знаний столько что бы быстро решить проблему, я не могу понять почему он делает запрос к не существующей базе.
Андрей 28 июня 2016 в 07:38 -3
small user social cms
я не могу понять почему он делает запрос к не существующей базе.

Он не к базе а таблице делает запрос, которой нет. То есть она не создалась, а уже надо искать причину почему.
Ris 28 июня 2016 в 09:13 +1
small user social cms
Попробуйте выполнить в phpmyadmin

Спойлер
потом

Спойлер
А если остался бэкап базы до обновления - лучше восстановиться из бэкапа и повторить обновление. Видимо что-то пошло не так, раз таблица не создалась, и неизвестно, что еще могло не так обновиться.
a1xzhu 28 июня 2016 в 15:48 0
small user social cms
Спасибо, уже есть продвижения, сделал все как вы написали, запросы в phpmyadmin и уже по крайней мере заработала админка (а то у нее был тоже белый экран), но сам сайт уже грузит вот это, (я так думаю чего то не хватает ему все равно), странно то что я пробовал с нуля ставил 2.1.2 и производил так же в ручном режиме обновление 2.2.0, обнова встает на ура, а таблицу эту её нет и не было.
Андрей 28 июня 2016 в 17:21 -2
small user social cms
Это мучения и гадания на кофейной гуще - имхо. Вы же сами написали что делали какие-то изменения с движком. Возьмите дистрибутив, проведите чистую установку и проверьте работу, а потом дистрибутив сравните с файлами своего движка. Программа Araxis Merge в помощь.
Pasha 28 июня 2016 в 19:49 +2
small user social cms
делаю обновление в ручном режиме, заливаю из папки файлы в корень сайта и все сразу белый экран
Базу нужно обновлять не после, а перед заливкой файлов и будет вам счастье.
Ris 28 июня 2016 в 19:53 +2
small user social cms
Версия 2.2.0 как раз и отличается от 2.1.2 наличием этих самых биндов к каждому типу контента.
Такое ощущение, что Вы файлы скопировали, а саму миграцию не проводили. А миграция заключается в обновлении таблиц базы данных.
Либо попробуйте установить обновление еще раз, либо, если не созданы Вы для легких путей, откройте файл \instantcms_20150316_v2.2.0\install\languages\ru\base.sql в ноутпэде++ и выполните все эскуэльные команды, что там есть в phpmyadmin.
a1xzhu 29 июня 2016 в 14:27 0
small user social cms
В общем, установил чистую 2.1.2 и сравнил со своей все файлы, ранее установленные хаки и плагины все удалил в том числе и из баз, перед ручным обновлением, произвел добавление таблиц в базы от 2.2.0 потом уже и сами файлы залил, в принципе все заработало, админка и сам сайт, на данный момент заметил косяк в админке не отображается весь контент дабвленный ранее в базе он есть, на сайте контент отображается если зайти в главную категорию допустим новости, а далее подкатегориях новостей где он так же должен отображаться его там нет. понимаю что косяк опять же в базе, где то видимо связка пропала
a1xzhu 4 июля 2016 в 14:09 0
small user social cms
Проблема решена, решение нашел http://instantcms.ru/forum/thread21293-1.htmlтут
mangol 2 января 2017 в 16:13 0
small user social cms
А почему бы сразу не избавить людей от белого экрана ?
Кирилл Эдуардович (Странник) 8 июня 2017 в 19:50 0
small user social cms
Потому что вывод ошибок на экран - любимый инструмента хакеров. Когда ошибки выключены, хакеры этого инструмента лишены. Поэтому обычно ошибки выключают. И вы включайте только для отладки кода, а не на "всякий случай". Отладили код - выключайте.
Кирилл Эдуардович (Странник) 8 июня 2017 в 19:47 0
small user social cms
Добавлю, что для упомянутых в статье настроек (даже если "все включено"), можно все равно получить белый экран.
Причина кроется в файле php.ini. Он может давить ошибки, даже если они включены в .htaccess. Я с таким только что столкнулся.

Если у вас есть доступ к php.ini, открываете его редактором и присваиваете следующим строчкам значения:
Код INI:
  1. display_errors = On
  2. display_startup_errors = On
Если нет - пишите в саппорт хостингу, чтобы эти значения подняли.

Временная мера - присвоить из скрипта локально. В самое начало скрипта пишем:
Код PHP:
  1. ini_set("display_errors", "1");
  2. ini_set("display_startup_errors", "1");
Эти команды будут работать не для всего сайта, а только для скрипта, в который этот код вставлен. Убедиться, что вывод ошибок включен/выключен, можно, поставив сразу после ini_set(); команду
Код PHP:
Выведет очень длинный перечень настроек, быстро найти нужные значения можно, заюзав поиск на странице ( Ctrl + F )
@dobroznai 5 ноября 2017 в 14:22 0
small user social cms
Ещё одна ситуация с белым экраном, которая возникает в админке при сохранении действий и открытии настроек компонентов (как было у меня), на виндоусе в файловом менеджере текстовые файлы открывались обычным блокнотом и вносились правки, оказывается так делать нельзя)) может кому ещё поможет, кто не в курсе) ошибки в логах при этом не записываются и в режиме отладки ничего не показывается, вот решение от техподдержки хоста:

Проблема была вызвана наличием BOM-символов в одном или нескольких файлах скриптов вашего сайта.
Почти все текстовые редакторы под Windows вставляют в самое начало текста так называемые BOM-символы при использовании кодировки UTF-8. Делается это для того, чтобы ОС в дальнейшем могла распознать данную кодировку - для Windows она не родная. Минус подобного подхода - при работе сначала подгружаются все используемые файлы, и только потом производится вывод контента в браузер. До вывода контента посылается несколько заголовков. Следствием этого является ошибка Cannot modify header information - headers already sent by (....).

Решений у этой проблемы несколько:

Перейти на Linux - UTF-8 для него почти родная кодировка
Использовать редакторы, которые поддерживают UTF-8 (без BOM) - например, Notepad++
Чтобы каждый раз при редактировании файла не менять кодировку руками, в «Настройках» Notepad++ можно выбрать Конфигурация->Новый документ->UTF-8 без метки BOM.
Есть способ просто удалить их из всех файлов разом такой командой по SSH:
find -type f|while read file;do [ "`head -c3 -- "$file"`" == $'\xef\xbb\xbf' ] && echo "sed -i -e 's/^\xEF\xBB\xBF//' $file";done | /bin/bash

Для Windows есть бесплатная программа utf8 bom-remover, которая также неплохо справляется с данной проблемой.
Андрей 5 ноября 2017 в 15:53 -2
small user social cms
Ещё проще использовать такой скрипт