Вместо вступления
Написать этот пост следовало давно, не доходили руки. Но прочитав очередное сообщение на форуме про “всё пропало, белый экран” я решил что наконец пора.
Речь пойдет о том самом “белом экране”, “белой странице” или “пустой странице”, поражающей своей загадочностью многих начинающих веб-энтузиастов.
Провести несколько минут за чтением этого поста крайне желательно и полезно, в первую очередь для вас самих. Ниже подробно расскажу почему. Да, текста довольно много и вы потратите некоторое время на чтение, но зато в экстренной ситуации сможете гарантированно сохранить в разы больше времени и нервов в ожидании помощи. Вам решать, стоит ли оно того.
И да, я знаю что этот вопрос давно описан в интернете со всех возможных сторон, но когда это кого-то волновало, не правда ли?
Немного теории
И так, что же такое “белый экран”? Это чистая страница в браузере, показываемая в случае когда сервер не вернул никакого 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_flag display_errors on
Если это не помогло (вы обновили страницу с ошибкой но текста по-прежнему нет) и у вас есть доступ к файлу php.ini на сервере, то вы можете включить директиву display_errors внутри этого файла. Потребуется перезапуск веб-сервера для того, чтобы изменения применились.
Способ 3. Поддержка хостинга
Если вы убедились что проблема не в SQL запросе (включение режима отладки в админке не показало текст ошибки на проблемной странице), а найти логи или включить вывод ошибок не получается — смело обращайтесь в поддержку хостера. Скажите им что вы получили фатальную ошибку PHP и вам нужен ее текст. Они должны объяснить где этот текст можно найти.
Вместо заключения
Я рад, что вы дочитали до этого места. Но вы, строго говоря, должны быть рады гораздо больше меня. Ведь теперь вы знаете как сэкономить кучу времени задавая вопрос на форуме в критической ситуации и предоставляя все необходимые подробности сразу, а не после чьей-либо просьбы.
Спасибо за внимание и удачи в сайтостроительстве!
Реклама #
Loadырь 9 лет назад #
Luxin 9 лет назад #
Алексей 9 лет назад #
На мой взгляд, взгляд начинающего веб-энтузиаста, в комментариях к этой публикации будет уместно увидеть распространенные ситуации (проблемы) и способы их решения.
Юрий 9 лет назад #
Александр 9 лет назад #
jorgovich 9 лет назад #
Aquarius 9 лет назад #
Потому что обе ветки давно заточены под самый стандартный хостинг, а скрипт установки ещё и дополнительно проверяет, что все эти (теперь обычнейшие) условия выполнены.
Если у вас из-за «сервака» глючит сайт, лучше просто найдите нормальный сервак
Ьascal 9 лет назад #
Ьascal 9 лет назад #
byb 9 лет назад #
Ьascal 9 лет назад #
Ьascal 9 лет назад #
a1xzhu 8 лет назад #
Странник 8 лет назад #
a1xzhu 8 лет назад #
Андрей 8 лет назад #
Он не к базе а таблице делает запрос, которой нет. То есть она не создалась, а уже надо искать причину почему.
Ris 8 лет назад #
a1xzhu 8 лет назад #
Андрей 8 лет назад #
Pasha 8 лет назад #
Ris 8 лет назад #
Такое ощущение, что Вы файлы скопировали, а саму миграцию не проводили. А миграция заключается в обновлении таблиц базы данных.
Либо попробуйте установить обновление еще раз, либо, если не созданы Вы для легких путей, откройте файл \instantcms_20150316_v2.2.0\install\languages\ru\base.sql в ноутпэде++ и выполните все эскуэльные команды, что там есть в phpmyadmin.
a1xzhu 8 лет назад #
a1xzhu 8 лет назад #
mangol 7 лет назад #
Странник 7 лет назад #
Странник 7 лет назад #
Причина кроется в файле php.ini. Он может давить ошибки, даже если они включены в .htaccess. Я с таким только что столкнулся.
Если у вас есть доступ к php.ini, открываете его редактором и присваиваете следующим строчкам значения:
Временная мера - присвоить из скрипта локально. В самое начало скрипта пишем:
dim 7 лет назад #
Проблема была вызвана наличием 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, которая также неплохо справляется с данной проблемой.
Андрей 7 лет назад #