|
Почетный модератор
11551 / 4346 / 452
Регистрация: 12.06.2008
Сообщений: 12,452
|
|||||||||||||||||||||||||||||||||||||||||
Что означает предупреждение "headers already sent"09.08.2011, 11:14. Показов 106264. Ответов 76
На форуме часто бывают вопросы, что при использовании session_start(), header() и setcookie() и некоторых других функций, появляется сообщения типа
Если кому интересны подробности, то вот немного теории
Давайте разберёмся, что происходит, когда мы заходим на сайт. Например, когда мы в браузере открываем страницу http://www.example.ru/file.php, то браузер запрашивает у DNS сервера, какой IP адрес принадлежит серверу www.example.ru. После этого он подключается по протоколу TCP к этому IP адресу на порт 80 (этот порт используется по умолчанию для HTTP) и отправляет текстовый запрос наподобие такого:
Так же обязательным является параметр Host. Т.к. на каждом сервере может быть несколько разных сайтов, то мы должны указать, к какому именно сайту мы хотим обратиться. Остальные параметры необязательны... ими браузер просто рассказывает о себе (User-Agent) и рассказывает серверу, как он хочет общаться. Но сейчас речь не об этом... В ответ на этот запрос веб-сервер запускает выполнение нашего php-скрипта, к которому обращается браузер. И веб-сервер отправляет браузеру результат работы скрипта... но перед этим он отправит свои заголовки ответа.
И вот мы подошли к основной сути... когда PHP приказывает веб-серверу начать отправлять само содержимое брузеру, то веб-серверу не остаётся ничего, кроме как отправить вначале все заголовки, которые имеются у него на текущий момент. Поэтому после этого PHP уже не сможет изменить эти заголовки. Функция header() изменяет любой заголовок. Функция setcookie() добавляет куки к заголовку Set-Cookie, поэтому тоже не может работать после отправки заголовков. session_start() добавляет куки с идентификатором сессии (как в примере выше). А пока найдём пути решения этой проблемы. Чаще всего такие ситуации происходят из-за использования BOM. BOM - это 2 или 3 невидимых символа в начале файла. Эти символы указывают на то, какая используется кодировка. Многие текстовые редакторы по умолчанию добавляют BOM ко всем файлам юникодовской кодировкой (например UTF-8). Например, создадим в блокноте файл
Я вижу 2 пути решения это проблемы: 1. Включить в php.ini
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? |
|
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
|
||
| 04.04.2014, 16:53 | ||
Потому что у Вас включен output_buffering = 4096 ?Добавлено через 14 минут Если Вы таким макаром отправите на вывод чуть больше данных — больше, чем значение output_buffering, — то произойде "смыв" (flush()), и Вы точно так же получите сабжевую ошибку.
1
|
||
|
Почетный модератор
11551 / 4346 / 452
Регистрация: 12.06.2008
Сообщений: 12,452
|
||
| 04.04.2014, 20:27 [ТС] | ||
|
(извиняюсь, не заметил ответа на следующей странице)
0
|
||
|
2 / 2 / 3
Регистрация: 28.01.2014
Сообщений: 76
|
|
| 15.04.2014, 18:55 | |
|
У меня тоже возникали подобные ошибки и не скрываю по моей вине!Заголовки надо отправлять в первую очередь на самом верху скрипта а я когда отправлял заголовки в середине скрипта то возникала ошибка!Немножко погуглив я нашел ответ и теперь эту ошибку не встречаю
0
|
|
|
0 / 0 / 0
Регистрация: 16.01.2015
Сообщений: 1
|
|
| 17.01.2015, 11:52 | |
|
Здраствуйте.
Возникла следуйщая проблема. Есть у меня код (честно притыренный и переработанный под свои нужды). Сам по себе он работает нормально, хотя и не хочет отсылать письма с мейл.ру. Но мне необходимо вставить его в сайт на основе вордпресс и тут начинаются вышеописанные проблемы. Я пытаюсь вставить его как "страницу". Для возможности подключать 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:1 3) in W:\domains\wp-vodokanal\wp-content\themes\twentytwelve\functions.ph p(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:1 3) in W:\domains\wp-vodokanal\wp-content\themes\twentytwelve\functions.ph p(512) : eval()’d code on line 2 Насколько я понимаю, вставлять сессию в "страницу" - в корне неправильно, так как перед ней идет файл headers.php. Если вставляю сессию и связанный с ней код в начало файла хедерс, все работает но "криво" - после отправки данных, меня переадресовывает на главную страницу, а когда перехожу обратно на нужную, там есть сообщения об отправке/ошибке. Понимаю, что делаю видимо неправильно, но в упор не знаю как грамотно впихнуть код в вордпресс. Зараннее благодарен.
0
|
|
|
6 / 6 / 5
Регистрация: 29.01.2015
Сообщений: 467
|
|||||||||||
| 05.02.2015, 14:02 | |||||||||||
|
Сегодня писал на mvc php авторизацию и получил такую ошибку, причём ругался на index.php:1. Я не заметил, прочесал весь контроллёр, вид, всю модель, потом заметил эту строку, зашел в файл, вроде не чего перед
0
|
|||||||||||
|
0 / 0 / 0
Регистрация: 10.02.2015
Сообщений: 1
|
|
| 10.02.2015, 21:08 | |
|
Огромное спасибо, отредактировала файл configuration.php и всё заработало. Извините, не нашла кнопки спасибо, поэтому пишу в сообщении.
0
|
|
|
Фрилансер
1871 / 1362 / 604
Регистрация: 12.01.2011
Сообщений: 5,470
|
||||||||||||||||||||||||
| 29.11.2015, 21:22 | ||||||||||||||||||||||||
|
Я добавлю от себя не много... Т.к людям пишешь , даешь эту ссылку а они всё равно не понимаю что нужно предпринять для того что бы ошибки не было. Я в одной тебе человеку объяснил наглядно и он понял. То ли лень им тут читать... не знаю.
вот это ↓ должно находится в начале файла.
1
|
||||||||||||||||||||||||
|
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
|
|
| 31.01.2016, 14:03 | |
|
1
|
|
|
Фрилансер
1871 / 1362 / 604
Регистрация: 12.01.2011
Сообщений: 5,470
|
|||||||
| 31.01.2016, 15:58 | |||||||
0
|
|||||||
|
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
|
||
| 28.02.2016, 23:42 | ||
|
Ну может output buffering включен, тогда будет работать.
1
|
||
|
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
|
|
| 19.05.2016, 00:10 | |
|
Было бы неплохо, если тема содержит "headers already sent", чтобы 1 ответом автоматически добавлялась ссылка на эту тему
1
|
|
|
0 / 0 / 0
Регистрация: 15.02.2018
Сообщений: 19
|
|
| 18.02.2018, 22:14 | |
|
ты пытаешься что-то выдать, явно или не явно, а потом вызываешь функцию header. но заголовки могут отсылаться только до текста документа
0
|
|
|
0 / 0 / 0
Регистрация: 09.09.2018
Сообщений: 9
|
|
| 09.09.2018, 18:18 | |
|
Здравствуйте. Видимо вечно буду ждать, когда придет активация на 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
|
|
|
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
|
||||
| 09.09.2018, 19:33 | ||||
|
0
|
||||
|
0 / 0 / 0
Регистрация: 09.09.2018
Сообщений: 9
|
|
| 09.09.2018, 19:45 | |
|
А это задокументировано оффициально? Почему тогда на MAMP без разницы как выставлять заголовки. До или после - оно просто оаботает отлично. Почему обвязка LAMP на LuA под Cent os тоже работает как угодно, а PHP на Ubuntu имеет такую ошибку? Кто то конкретно ответить может почему не весь вывод, а конкретно выбросы из БД ломают инструкции header. Только прошу без дилетантства потому что у большинства несведущих в качестве экономных шустриков и программистов в кавычках ubuntu и они считают что так и должно быть. Я собираю максимум данных и ситуаций чтобы написать об ошибке.
У меня архитектура такая. И я не собираюсь ее менять из-за прихоти какой то случайности. Так как использовать буфер для формирования корректной html 5 страницы оставив одну переменную с телом кода html? Дело в том что так проще всего довести до совмесьимости... буквально три четыре вставки в код и готово.
0
|
|
|
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
|
||||
| 09.09.2018, 19:54 | ||||
|
И опять же какой смысл в делать вывод данных вместе с редиректом? Лишний трафик уйдет, но никакой ценности он не предоставляет. При большом числе пользователей это может стать проблемой.
1
|
||||
|
0 / 0 / 0
Регистрация: 09.09.2018
Сообщений: 9
|
|
| 09.09.2018, 20:10 | |
|
Вот. Спасибо. Конкретика. Буду тестировать этот буфер чтобы докопаться до сути.
Идет например проверка авторизации. Имя и пароль верны, ставим куки и редиректим на морду. У меня вот так header используется. Не вижу особой проблемы в архитектуре если честно. Как бы я еще этот редирект сделал. У меня один рабочий рут на контроллере это index.php. все остальное заблокировано и на текущем хостинге великолепно раблтает все включая свой самописный модуль форума.
0
|
|
|
377 / 319 / 73
Регистрация: 15.09.2017
Сообщений: 1,436
|
||
| 09.09.2018, 20:19 | ||
|
Вам Jewbacabra все по полочкам разложил.
1
|
||
|
0 / 0 / 0
Регистрация: 09.09.2018
Сообщений: 9
|
|
| 09.09.2018, 20:24 | |
|
Видимо есть и другой путь. Я писал всю систему чистого времени четыре месяца. чего то мог не предусмотреть. В любом случае, если проблема решаема счетчиком байт до вывода заголовка и это можно сделать с помощью ини. Я так и поступлю. Не считаю это преступлением как таковым. Скорее непредусмотренностью самого php.
0
|
|
| 09.09.2018, 20:24 | |
|
Помогаю со студенческими работами здесь
40
Постоянные ошибки с сессиями (headers already sent и Cannot modify headers) Что означает появление письменности (языка), и что означает реформа письменности (языка)? Что означает, что определение метода находится внутри определения класса? Поясните пожалуйста что означает двоеточие и то что идет после него Что такое dy1 и dy2 в программе, и зачем мы их перемножаем. Что означает строчка x=x1 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|