Устранение ошибок «headers already sent» (заголовки уже посланы)

Задача
При попытке послать заголовок HTTP или cookie с помощью функций header() или setcookie() PHP выдает сообщение об ошибке «headers already sent» (заголовки уже посланы).

Решение
Эта ошибка возникает при передаче выходной информации, отличной от заголовка, до вызова функций header() или setcookie( ).

Перепишите программу так, чтобы любой вывод осуществлялся после передачи заголовков:
// правильно
setcookie("name", $name);
print "Hello $name!";
// неправильно
print "Hello $name!";
setcookie("name", $name);
// правильно

Hello

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

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


Для удаления ведущих и замыкающих пробельных строк из файла предназначена функция trim():

$file = '/path/to/file.php';
// делаем резервную копию
copy($file, "$file.bak") or die("Can't copy $file: $php_errormsg);
// читаем и удаляем концевые пробелы
$contents = trim(join('',file($file)));
// записываем
$fh = fopen($file, 'w') or die("Can't open $file for writing: $php_errormsg);
if (-1 == fwrite($fh, $contents)) { die("Can't write to $file: $php_errormsg); }
fclose($fh) or die("Can't close $file: $php_errormsg);

Возможно, вместо обработки файлов по принципу один за другим было бы удобнее обрабатывать их по принципу каталог за каталогом. О том, как обработать все файлы в каталоге, рассказано в рецепте 19.7.

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

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Аутентификация, основанная на cookies
Буферизация вывода в броузер
Взаимодействие в рамках Apache
Идентификация различных броузеров
Настройка обработки ошибок

Вернуться в раздел: PHP / 8. Основы Web