|
Почетный модератор
11560 / 4354 / 453
Регистрация: 12.06.2008
Сообщений: 12,456
|
|||||||||||||||||||||||||||||||||||||||||
Что означает предупреждение "headers already sent"09.08.2011, 11:14. Показов 107617. Ответов 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
|
||
|
Почетный модератор
11560 / 4354 / 453
Регистрация: 12.06.2008
Сообщений: 12,456
|
||
| 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 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром.
возможно получится прикрутить интерпретатор питон для кастомизации игровой логики.
что есть на текущий момент:. . .
|
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2.
Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
|