Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
|
|||||||||||
1 | |||||||||||
Что означает предупреждение "headers already sent"09.08.2011, 11:14. Показов 102258. Ответов 76
На форуме часто бывают вопросы, что при использовании 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 есть пустая строка... её тоже нужно убрать. Если вначале вам необходимо отправлять данные, то можно включить использование буфера, что бы данные не отправлялись сразу браузеру:
57
|
09.08.2011, 11:14 | |
Ответы с готовыми решениями:
76
Что означает предупреждение " comparison between signed and unsigned integer expressions" Выходит предупреждение headers already sent by Событие A означает, что извлечены 3 зеленых, а событие В - извлечены 3 красных леденца. Что означает сумма А или B? Постоянные ошибки с сессиями (headers already sent и Cannot modify headers) |
mambob
|
|
28.06.2012, 22:20 | 2 |
Ребята вы лепете из не поняТно чего -слона,проблема у меня встречалась решил ее я очень простo: оставил оригинальный файл на англиском config.php , не меняйте его на те которые в пакетах русификатора идут! Добавлено через 4 минуты вообще не вижу смысла в русификации конфига ,от этого ошибки есть а проку нет,ведь все дерективы все равно на английском...ююю |
Почетный модератор
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
|
|
28.06.2012, 22:25 | 3 |
вы вообще о чем..? проблема спокойно может возникнуть даже на простеньком скрипте авторизации с сессиями или даже куками при подключении его скажем, при табличной верстке где сверху идет строка-шапка, а снизу в колонке авторизация. и что же вы предлагаете? ок, вы предлагаете оставлять какой то оригинальный config.php который тут вообще ни при чем - удачи, но не советуйте это другим людям, которые никаких русификаторов не делают и не скачивали даже, а написали простенькую CMS и у них не работает авторизация из за того что заголовки отправлены.
а насчет этого - введите просто в поиске эту ошибку и вы увидите сколько везде ее обсуждают, и тогда уже подумайте, слона лепят люди сами - или все таки он сам лепится?)
1
|
463 / 463 / 23
Регистрация: 17.08.2011
Сообщений: 1,488
|
|
28.06.2012, 22:28 | 4 |
сам лепится потому, что люди не соблюдают архитектуру, а лепят друг на друга всё. А чё, пых-то позволяет, чтоб его освоить, IQ и обезьяны хватит
0
|
Почетный модератор
11525 / 4320 / 448
Регистрация: 12.06.2008
Сообщений: 12,412
|
||||||
29.06.2012, 11:33 [ТС] | 5 | |||||
BOM зависит только от кодировки... даже если в файле нет русских букв, то он всё равно может присутствовать. Тут всё зависит от текстового редактора, которым правится файл. Если он будет ставить BOM всем файлам с UTF-8, то отсутствие русских букв не спасёт.
При большом желании извращений, можно и на русском всё сделать
Лепится от того, что многие "программисты" не понимают, как оно работает. Они просто тупо выполняют инструкции из какой-то книжки (автор которой может сам не понимать принципы), не задумываясь, что при этом происходит.
0
|
463 / 463 / 23
Регистрация: 17.08.2011
Сообщений: 1,488
|
|
29.06.2012, 13:35 | 6 |
1
|
0 / 0 / 0
Регистрация: 05.08.2012
Сообщений: 23
|
||||||
05.08.2012, 12:24 | 7 | |||||
А что делать если подобная ошибка возникает после отправки емейл?
Те нужно отправить мыло и сразу перенаправить на другой адрес:
0
|
Почетный модератор
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
|
||||||
05.08.2012, 13:02 | 9 | |||||
например можно использовать javascript вместо header:
3
|
-9 / 0 / 0
Регистрация: 08.08.2012
Сообщений: 5
|
|
08.08.2012, 04:42 | 10 |
Была такая же ошибка, при чем вся структура страницы правильно(ни каких выводов символов не было до использования setcookie), искал причину часа два, все таки нашел. Оказалось в php.ini было "output_buffering" выключена. Поставил On и все стало на свои места.
0
|
1 / 1 / 0
Регистрация: 27.02.2012
Сообщений: 61
|
|
19.01.2013, 14:00 | 11 |
Спасибо, Алексей! И мне помогло решить проблему! Новички рулят!
0
|
1362 / 1074 / 110
Регистрация: 16.03.2012
Сообщений: 4,543
|
|
19.10.2013, 22:08 | 12 |
Спасибо. Фишка с
Код
output_buffering = 4096
0
|
1362 / 1074 / 110
Регистрация: 16.03.2012
Сообщений: 4,543
|
|
20.10.2013, 10:32 | 14 |
sqlnub, при переводе сайта с LAMP на денвер под виндой была ошибка сессии. Это параметр по умолчанию у денвера.
0
|
Заблокирован
|
||||||
20.10.2013, 17:51 | 15 | |||||
У меня тоже отключен:
Потому: Кликните здесь для просмотра всего текста
These messages occur when a script attempts to modify a header after it has already been sent back to the requesting user. Most commonly they are the result of the programmer attempting to send a cookie to the user after some output has already been sent back to the browser, which is impossible to accomplish because the header (not seen by the user, but used by the browser) will always precede that output.
PHP version 4.0 offered a solution to this annoying problem by introducing the concept of output buffering When enabled, output buffering tells PHP to send all output at once, after the script has been completed. This way, any subsequent changes to the header can be made throughout the script because it hasn't yet been sent. http://www.tutorialsscripts.co... fering.php Это называется разгладить косяки. Я лишь пытаюсь довести до сведения мифотворцев что если все сделано правильно, без ошибок, то ничего не потребуется сглаживать и упомянутая настройка устраняет только симптомы, но не лечит.
0
|
6 / 3 / 0
Регистрация: 25.06.2012
Сообщений: 132
|
||||||
24.10.2013, 15:33 | 16 | |||||
У меня текстовый редактор Adobe Dreamweaver CS5.5. Кодировка UTF-8 в файле edit_text.php ошибка:
Warning: Cannot modify header information - headers already sent by (output started at Z:\home\localhost\www\phpforyou.by\admin\edit_text.php:1) in Z:\home\localhost\www\phpforyou.by\admin\lock.php on line 6 Warning: Cannot modify header information - headers already sent by (output started at Z:\home\localhost\www\phpforyou.by\admin\edit_text.php:1) in Z:\home\localhost\www\phpforyou.by\admin\lock.php on line 7 Поставил в php.ini output_buffering = 4096 Теперь ошибка в файле bd.php: Fatal error: Call to undefined function mysql_connect() in Z:\home\localhost\www\phpforyou.by\admin\blocks\bd.php on line 2 Вот сами файлы: edit_text.php -------
--------- <?php $db = mysql_connect ("localhost","php","12345"); mysql_select_db ("phpforyou", $db); ?>
0
|
6 / 3 / 0
Регистрация: 25.06.2012
Сообщений: 132
|
|
25.10.2013, 16:59 | 18 |
В php.ini extension=php_mysql.dll раскомментирована уже была у меня. В чём ещё может быть проблемма. Надо всего лишь чтобы в блоке админа был пароль......
Добавлено через 1 час 14 минут открываю phpmyadmin через браузер, а там такая ошибка: Расширение mysqli не найдено. Пожалуйста, проверьте ваши настройки PHP. <a href="Documentation.html#faqmysql" target="documentation"><img src="themes/dot.gif" title="Документация" alt="Документация" class="icon ic_b_help" /></a> Хотя в php.ini это расширение раскомментировано.
0
|
71 / 70 / 21
Регистрация: 04.04.2012
Сообщений: 351
|
|
25.10.2013, 17:52 | 19 |
проверьте extension_dir в php.ini и проверьте наличие соответствующих dll в той папке
0
|
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
|
||||||
04.04.2014, 16:28 | 20 | |||||
А почему у меня таких ошибок не выводится?
Создал простой скрипт:
Итог работы скрипта - действительно создается кука "Hello" со значением "world!", к http-заголовкам от сервера добавляется строка "Hello: world!", а так же стартует сессия, в итоге вывод скрипта такой: Код
Hello world!
0
|
04.04.2014, 16:28 | |
04.04.2014, 16:28 | |
Помогаю со студенческими работами здесь
20
Что означает появление письменности (языка), и что означает реформа письменности (языка)? Что означает, что определение метода находится внутри определения класса? Поясните пожалуйста что означает двоеточие и то что идет после него Что такое dy1 и dy2 в программе, и зачем мы их перемножаем. Что означает строчка x=x1 подскажите, пожалуйста, что означает отрезок [-pi/2,pi/2] , это длина отрезка или что? Что означает PSET в бейсике и что в скобке? И как записать его в Матлабе? Тормоза в играх при вращении камеры/перемещении. Что это означает и что проапгрейдить? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |