При попытке послать заголовок HTTP или cookie с помощью функций header() или setcookie() PHP выдает сообщение об ошибке «headers already sent» (заголовки уже посланы).
Эта ошибка возникает при передаче выходной информации, отличной
от заголовка, до вызова функций header( ) или setcookie( ).
Перепишите программу так, чтобы любой вывод осуществлялся после
передачи заголовков:
// правильно
setcookie("name", $name);
print "Hello $name!";
// неправильно
print "Hello $name!";
setcookie("name", $name);
// правильно
<?php setcookie("name",$name); ?>
<html><title>Hello</title>
Сообщения HTTP имеют заголовок и тело, пересылаемые пользователю именно в таком порядке. Если посылка тела начата, то уже нельзя
послать какой-либо заголовок. Поэтому если функция setcookie() вызывается после печати некоторого содержания HTML, то PHP не может послать соответствующий заголовок Cookie.
Кроме того, необходимо удалять замыкающий пробельный символ в
любом включаемом файле. Если включить файл с строками, содержаими пробельные смволы, вне тегов <?php ?>, то эти строки будут переданы броузеру. Для удаления ведущих и замыкающих пробельных строк из файла предназначена функция 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);
Возможно, вместо обработки файлов по принципу один за другим было
бы удобнее обрабатывать их по принципу каталог за каталогом. О том,
как обработать все файлы в каталоге, рассказано в рецепте Обработка всех файлов в каталоге
Если вы не хотите беспокоиться о пробельных строках, нарушающих
посылку заголовков, включите буферизацию вывода. Буферизация
выходной информации не дает PHP немедленно посылать весь вывод
клиенту, и в случае применения буфера вывода можно смело смешивать заголовки и тело. Однако пользователям может показаться, что
ваш сервер стал тратить больше времени на выполнение их запросов,
поскольку им приходится дольше ждать, когда броузер выведет на экран какую-нибудь информацию.
Документацию по функции header() на http://www.php.net/header.