Почетный модератор
11166 / 4124 / 411
Регистрация: 12.06.2008
Сообщений: 11,943
|
|||||||||||
1 | |||||||||||
Что означает предупреждение "headers already sent"09.08.2011, 11:14. Просмотров 84728. Ответов 73
На форуме часто бывают вопросы, что при использовании session_start(), header() и setcookie() и некоторых других функций, появляется сообщения типа
Код
Warning: session_start(): Cannot send session cookie - headers already sent in D:\HTTP\a.php on line 5 Warning: session_start(): Cannot send session cache limiter - headers already sent in D:\HTTP\a.php on line 5 Код
Warning: Cannot modify header information - headers already sent in D:\HTTP\a.php on line 5 Если кому интересны подробности, то вот немного теории
Давайте разберёмся, что происходит, когда мы заходим на сайт. Например, когда мы в браузере открываем страницу http://www.example.ru/file.php, то браузер запрашивает у DNS сервера, какой IP адрес принадлежит серверу www.example.ru. После этого он подключается по протоколу TCP к этому IP адресу на порт 80 (этот порт используется по умолчанию для HTTP) и отправляет текстовый запрос наподобие такого:
Код
GET /file.php HTTP/1.1 Host: www.example.ru User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru,chrome://global/locale/intl.properties;q=0.5 Accept-Encoding: gzip, deflate Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7 Connection: keep-alive Cookie: user=2; var=blablabla Так же обязательным является параметр Host. Т.к. на каждом сервере может быть несколько разных сайтов, то мы должны указать, к какому именно сайту мы хотим обратиться. Остальные параметры необязательны... ими браузер просто рассказывает о себе (User-Agent) и рассказывает серверу, как он хочет общаться. Но сейчас речь не об этом... В ответ на этот запрос веб-сервер запускает выполнение нашего php-скрипта, к которому обращается браузер. И веб-сервер отправляет браузеру результат работы скрипта... но перед этим он отправит свои заголовки ответа. Код
HTTP/1.1 200 OK Date: Tue, 09 Aug 2011 06:59:22 GMT Server: Apache X-Powered-By: PHP/5.3.5 Content-Length: 1234 Content-Type: text/html; charset=windows-1251 Set-Cookie: PHPSESSID=3ms50sjl2pt2s19sns5udiryn6; path=/ <!DOCTYPE html> <html> ...... И вот мы подошли к основной сути... когда PHP приказывает веб-серверу начать отправлять само содержимое брузеру, то веб-серверу не остаётся ничего, кроме как отправить вначале все заголовки, которые имеются у него на текущий момент. Поэтому после этого PHP уже не сможет изменить эти заголовки. Функция header() изменяет любой заголовок. Функция setcookie() добавляет куки к заголовку Set-Cookie, поэтому тоже не может работать после отправки заголовков. session_start() добавляет куки с идентификатором сессии (как в примере выше). А пока найдём пути решения этой проблемы. Чаще всего такие ситуации происходят из-за использования BOM. BOM - это 2 или 3 невидимых символа в начале файла. Эти символы указывают на то, какая используется кодировка. Многие текстовые редакторы по умолчанию добавляют BOM ко всем файлам юникодовской кодировкой (например UTF-8). Например, создадим в блокноте файл
Код
п»ї<?php ?> Я вижу 2 пути решения это проблемы: 1. Включить в php.ini Код
output_buffering = 4096 2. Запретить текстовому редактору сохранять BOM. Но тут уже всё зависит от возможностей текстового редактора, который вы используете. Например, я пользуюсь Notepad++... там можно открыть меню "Кодировки" и выбрать "Преобразовать в UTF-8 без BOM". Если вы уверены, что BOM не используется, значит где-то перед функциями header(), setcookie() и т.п. вы сами отправляете данные пользователю. Возможно, перед открытием тега <?php есть пустая строка... её тоже нужно убрать. Если вначале вам необходимо отправлять данные, то можно включить использование буфера, что бы данные не отправлялись сразу браузеру:
56
|
|
09.08.2011, 11:14 | |
Что означает знак "?" и амперсант в браузерной строке? Что означает "бинарно-безопасное сравнение"?
Что означает $_GET["currentPage"]? |
|
13193 / 6580 / 1040
Регистрация: 10.01.2008
Сообщений: 15,069
|
|
04.04.2014, 16:53 | 21 |
![]() Добавлено через 14 минут Если Вы таким макаром отправите на вывод чуть больше данных — больше, чем значение output_buffering, — то произойде "смыв" (flush()), и Вы точно так же получите сабжевую ошибку.
1
|
2 / 2 / 3
Регистрация: 28.01.2014
Сообщений: 76
|
|
15.04.2014, 18:55 | 23 |
У меня тоже возникали подобные ошибки и не скрываю по моей вине!Заголовки надо отправлять в первую очередь на самом верху скрипта а я когда отправлял заголовки в середине скрипта то возникала ошибка!Немножко погуглив я нашел ответ и теперь эту ошибку не встречаю
![]()
0
|
0 / 0 / 0
Регистрация: 16.01.2015
Сообщений: 1
|
|
17.01.2015, 11:52 | 24 |
Здраствуйте.
Возникла следуйщая проблема. Есть у меня код (честно притыренный и переработанный под свои нужды). Сам по себе он работает нормально, хотя и не хочет отсылать письма с мейл.ру. Но мне необходимо вставить его в сайт на основе вордпресс и тут начинаются вышеописанные проблемы. Я пытаюсь вставить его как "страницу". Для возможности подключать php вставил в functions.php используемой темы следуйщий код: Кликните здесь для просмотра всего текста
function exec_php($matches){
eval('ob_start();'.$matches[1].'$inline_execute_output=ob_get_contents();ob_end_clean();') ; return $inline_execute_output; } function inline_php($content){ $content = preg_replace_callback('/\[exec\]((.|\n)*?)\[\/exec\]/', 'exec_php', $content); $content = preg_replace('/\[exec off\]((.|\n)*?)\[\/exec\]/', '$1', $content); return $content; } add_filter('the_content', 'inline_php', 0); Ошибки выбивает следуйщие: Кликните здесь для просмотра всего текста
Warning: session_start() [function.session-start]: Cannot send session cookie — headers already sent by (output started at W:\domains\wp-vodokanal\wp-content\themes\twentytwelve\header.php:13) in W:\domains\wp-vodokanal\wp-content\themes\twentytwelve\functions.php(512) : eval()’d code on line 2
Warning: session_start() [function.session-start]: Cannot send session cache limiter — headers already sent (output started at W:\domains\wp-vodokanal\wp-content\themes\twentytwelve\header.php:13) in W:\domains\wp-vodokanal\wp-content\themes\twentytwelve\functions.php(512) : eval()’d code on line 2 Насколько я понимаю, вставлять сессию в "страницу" - в корне неправильно, так как перед ней идет файл headers.php. Если вставляю сессию и связанный с ней код в начало файла хедерс, все работает но "криво" - после отправки данных, меня переадресовывает на главную страницу, а когда перехожу обратно на нужную, там есть сообщения об отправке/ошибке. Понимаю, что делаю видимо неправильно, но в упор не знаю как грамотно впихнуть код в вордпресс. Зараннее благодарен.
0
|
6 / 6 / 5
Регистрация: 29.01.2015
Сообщений: 455
|
|||||||||||
05.02.2015, 14:02 | 25 | ||||||||||
Сегодня писал на mvc php авторизацию и получил такую ошибку, причём ругался на index.php:1. Я не заметил, прочесал весь контроллёр, вид, всю модель, потом заметил эту строку, зашел в файл, вроде не чего перед
0
|
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 1
|
|
10.02.2015, 21:08 | 26 |
Огромное спасибо, отредактировала файл configuration.php и всё заработало. Извините, не нашла кнопки спасибо, поэтому пишу в сообщении.
0
|
Фрилансер
![]() ![]() ![]() 1840 / 1338 / 597
Регистрация: 12.01.2011
Сообщений: 5,371
|
|||||||||||||||||||||
29.11.2015, 21:22 | 27 | ||||||||||||||||||||
Я добавлю от себя не много... Т.к людям пишешь , даешь эту ссылку а они всё равно не понимаю что нужно предпринять для того что бы ошибки не было. Я в одной тебе человеку объяснил наглядно и он понял. То ли лень им тут читать... не знаю.
вот это ↓ должно находится в начале файла.
1
|
![]() 4443 / 3619 / 1520
Регистрация: 24.04.2014
Сообщений: 10,665
|
|
31.01.2016, 14:03 | 28 |
1
|
Фрилансер
![]() ![]() ![]() 1840 / 1338 / 597
Регистрация: 12.01.2011
Сообщений: 5,371
|
||||||
31.01.2016, 15:58 | 29 | |||||
Да не дописал.
0
|
![]() 4443 / 3619 / 1520
Регистрация: 24.04.2014
Сообщений: 10,665
|
|
28.02.2016, 23:42 | 31 |
Не так - это header после вывода?
Ну может output buffering включен, тогда будет работать.
1
|
![]() 4443 / 3619 / 1520
Регистрация: 24.04.2014
Сообщений: 10,665
|
|
19.05.2016, 00:10 | 32 |
Было бы неплохо, если тема содержит "headers already sent", чтобы 1 ответом автоматически добавлялась ссылка на эту тему
1
|
0 / 0 / 0
Регистрация: 15.02.2018
Сообщений: 19
|
|
18.02.2018, 22:14 | 33 |
ты пытаешься что-то выдать, явно или не явно, а потом вызываешь функцию header. но заголовки могут отсылаться только до текста документа
0
|
0 / 0 / 0
Регистрация: 09.09.2018
Сообщений: 9
|
|
09.09.2018, 18:18 | 34 |
Здравствуйте. Видимо вечно буду ждать, когда придет активация на email и напишу тут. Да простят меня создатели темы.
Написал свою CMS на PHP 7 + MySQL и столкнулся с такой проблемой, что на некоторых хостингах, в частности на базе UBUNTU, не всегда срабатывает инструкция header('Location: ') или set_cookie после любой инструкции print в шаблонах. Что характерно, так это то что на сервере на базе lua с PHP 7 header работает исправно даже после print в шаблон. Но меня интересует добиться совместимости и с остальными хостингами и поэтому я хочу переписать на Output Buffering Control с использованием ob_start(). Дело в том, что я не нашел в PHP поддержку DOCTYPE HTML 5 с нужными мне namespace и не знаю есть ли способ это испаравить? Подскажите, как вывести с помощью Output Buffering Control разметку страницы на основе HTML 5 со всей microdata и JSON\LD? Вот код для проверки: http://cyberx.pro/revolver-cms-v.1.3.2/ Еще была странная ситуация что на LUA + Linux не работала инструкция header после вывода sidebar. Я долго ковырялся и нашел ошибку какого то непонятного происхождения после вывода одного из комментариев из базы данных. Print оставлся, а код я закоментирновал и header заработал прекрасно. Я сделал вывод что это ошибка самого PHP или какой-то его характерной сборки(может компилятор Linux глючнул). Естественно вывод до этого тоже присутствовал - это была doctype и head страницы, но ошибка была именно из-за вывода sidebar через print. Мне уже писали, что-то вроде того, что так быть не может и после первого же принт не работает header, хотя я доказал, что дело не в этом. Поэтому не пишите пожалуйста, что так не делается. Вообще можно ли как-то избежать использования OB для того, чтобы оставить header инструкцию рабочей на всех вариантах серверов PHP и Linux(у меня прекрасно работает на Mac OS и на Linux + LUA server)? Может дело в какой-то системной настройке? p.s.: просьба лузеров-профи с форума php.ru, считающих PHP святым граалем работающим везде стабильно и без ошибок пройти сию тему мимо.
0
|
![]() 4443 / 3619 / 1520
Регистрация: 24.04.2014
Сообщений: 10,665
|
|
09.09.2018, 19:33 | 35 |
Все правильно, и не должно работать
ЩИТО? lua - это язык программирования. Не надо ерундой заниматься, output buffering не для этого придуман. Сперва должен идти вывод заголовков, и только потом тела.
0
|
0 / 0 / 0
Регистрация: 09.09.2018
Сообщений: 9
|
|
09.09.2018, 19:45 | 36 |
А это задокументировано оффициально? Почему тогда на MAMP без разницы как выставлять заголовки. До или после - оно просто оаботает отлично. Почему обвязка LAMP на LuA под Cent os тоже работает как угодно, а PHP на Ubuntu имеет такую ошибку? Кто то конкретно ответить может почему не весь вывод, а конкретно выбросы из БД ломают инструкции header. Только прошу без дилетантства потому что у большинства несведущих в качестве экономных шустриков и программистов в кавычках ubuntu и они считают что так и должно быть. Я собираю максимум данных и ситуаций чтобы написать об ошибке.
У меня архитектура такая. И я не собираюсь ее менять из-за прихоти какой то случайности. Так как использовать буфер для формирования корректной html 5 страницы оставив одну переменную с телом кода html? Дело в том что так проще всего довести до совмесьимости... буквально три четыре вставки в код и готово.
0
|
![]() 4443 / 3619 / 1520
Регистрация: 24.04.2014
Сообщений: 10,665
|
|
09.09.2018, 19:54 | 37 |
Изучай протокол http
Может по-умолчанию быть включенной директива output buffering. Но это не значит что так надо решать проблему. Output buffering задает количество байт, после которых нужно начинать отправку тела ответа. Если в какой-либо момент станет отправляться хоть на 1 байт больше, то тело опять станет отправляться раньше заголовков. И опять же какой смысл в делать вывод данных вместе с редиректом? Лишний трафик уйдет, но никакой ценности он не предоставляет. При большом числе пользователей это может стать проблемой. Значит архитектура не очень. Всегда можно сначала обработать данные, понять нужен ли редирект, и только к самый последний момент заняться формированием тела ответа.
1
|
0 / 0 / 0
Регистрация: 09.09.2018
Сообщений: 9
|
|
09.09.2018, 20:10 | 38 |
Вот. Спасибо. Конкретика. Буду тестировать этот буфер чтобы докопаться до сути.
Идет например проверка авторизации. Имя и пароль верны, ставим куки и редиректим на морду. У меня вот так header используется. Не вижу особой проблемы в архитектуре если честно. Как бы я еще этот редирект сделал. У меня один рабочий рут на контроллере это index.php. все остальное заблокировано и на текущем хостинге великолепно раблтает все включая свой самописный модуль форума.
0
|
292 / 244 / 65
Регистрация: 15.09.2017
Сообщений: 1,139
|
|
09.09.2018, 20:19 | 39 |
Ну, правильно, только аутентификации. Зачем до этого делать echo?
Вам Jewbacabra все по полочкам разложил.
1
|
0 / 0 / 0
Регистрация: 09.09.2018
Сообщений: 9
|
|
09.09.2018, 20:24 | 40 |
Видимо есть и другой путь. Я писал всю систему чистого времени четыре месяца. чего то мог не предусмотреть. В любом случае, если проблема решаема счетчиком байт до вывода заголовка и это можно сделать с помощью ини. Я так и поступлю. Не считаю это преступлением как таковым. Скорее непредусмотренностью самого php.
0
|
09.09.2018, 20:24 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Что означает символ "&" ? Что означает "?" ? Не работает setcookies: "Cannot modify header information - headers already sent by" Ошибка : "Warning: Cannot modify header information - headers already sent by" Ошибка "Cannot modify header information - headers already sent by" - PHP
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |