Как избавиться от сообщений “headers already sent”

Предположим, вы пытаетесь отправить HTTP-заголовок или cookie с помощью функции header(), session_start() или setcookie(), но PHP выдает сообщение “headers already sent” (”заголовки уже отправлены”). Эта ошибка возникает, если вы отправили содержимое браузеру до вызова функции header(), session_start() или setcookie(). PHP посылает заголовки автоматически, как только скрипт начинает выдавать браузеру информацию. Перепишите свой код так, чтобы вывод содержимого происходил после отправки заголовков:

// Правильно
setcookie("name", $name);
echo "Hello, $name";
// Неправильно
echo "Hello, $name";
setcookie("name", $name);
// Правильно
<?php setcookie("name", $name); ?>
<html><title>Hello</title>

Любое HTTP-сообщение имеет заголовок и тело, которые отправляются браузеру именно в таком порядке. Начав отправку тела, вы больше не можете отправлять заголовки. Поэтому, если вы вызовете функцию setcookie() после вывода HTML-кода, PHP не сможет отправить надлежащий заголовок cookie.

Вы также должны убрать из подключеных файлов завершающие пробельные символы. Когда вы подключаете php-файл с пустыми строчками вне тегов <?php ?>, эти строчки отправляются браузеру.

Другой способ гарантировать отсутствие завершающих пробельных символов в подключаемом файле является отказ от использования закрывающего тега ?>. Если подключаемый файл содержит только PHP-код, этот метод избавит вас от необходимости возвращаться к этому файлу и удалять из него нечаянно поставленные пробельные символы.

Если вы хотите полностью избавить себя от беспокойства по поводу пустых строчек, вызывающих отправку заголовков, включите буферизацию вывода. Она не позволит PHP немедленно отправлять вывод клиенту. Если вы буферизируете свой вывод, то можете перемешивать заголовки и текст сообщений. Однако в этом случае у пользователей может возникнуть впечатление, что ваш сервер медленно обслуживает их запросы, потому что браузер будет выводить содержимое на экран с некоторой задержкой.

Комментариев: 3

  1. Luge:

    Дополнительной проблемой может быть сигнатура BOM при сохранении файла в кодировке UTF-8. При сохранении в utf в начало файла добавляются 3 символа, указывающие кодировку. Поэтому в редакторе стоит настроить опцию «сохранить без сигнатуры BOM». Ну, или что-то в роде этого, от проги зависит.

    Ну и классическая ссылка http://phpfaq.ru/headers

  2. Артём Курапов:

    А ещё может быть пустое место (пробел или перенос строки) после закрытие тэга php-кода в конце файла. Поэтому хорошая практика их не ставить. А во вторых - разделять echo от бизнес-процессов.

  3. Скриптер:

    Всегда делаю файлы без BOM и не оставляю строки в начале и конце файла, почти никогда проблем с лишним посылом заголовков не было.

Оставьте свой отзыв