Cannot modify header information - headers already sent by

1,00
р.
Не сохраняются куки. Что не так.
Ошибка
Warning: Cannot modify header information - headers already sent by (output started at blocksSite/main_noauth.php:4) in blocksSite/main_noauth.php on line 58

Ответ
Общение WEB-сервера с клиентом в данном случае происходит по протоколу HTTP. HTTP включает в себя HTTP заголовки и тело ответа. При этом заголовки обязательно следуют перед телом ответа – того требует стандарт.
PHP же в свою очередь в процессе работы должен сформировать и заголовки и тело ответа. Даже если Вы не задаете ни одного заголовка, то PHP сам устанавливает все необходимые заголовки для ответа клиенту. При этом данные, которые необходимо отдать клиенту он записывает сначала в буфер, но если он начал писать в буфер тело ответа, то заголовки он уже никак не может туда записать и встретив попытку записи заголовков ответа уже после того, как начало формироваться тело ответа PHP выдает ошибку:
Warning: Cannot modify header information - headers already sent by (output started at ...
Это может быть следствием следующих причин:
Перед установкой заголовков был вывод тела ответа. При этом вывод может быть осуществлен как средствами шаблонизатора, так и через функции echo или print // вывод средствами шаблонизатора <?php echo "<body>" // вывод средствами оператора header( "Content-Type: text/html charset=utf-8" )
Вы можете банально ошибиться и поставить перед <? пробелы или переносы строк, которые тоже будут восприняты как тело ответа.<br>Ровно так же как и в пункте 2, но в конце php-файла: Файл incrementX.php <?php $x++ ?>[пробел][перенос строки]
Файл index.php <?php include( "incrementX.php" ) header( ... ) <br> Файлы, которые содержат PHP-код должны быть сохранены без BOM. Как сохранить файл без BOM.
Не забывайте, что если Вы подключаете файлы через include или require, то файлы к которым обращаются эти функции также могут содержать одну из трех вышеперечисленных проблем. include( "include.inc" ) // include.inc может формировать тело ответа header( ... )
Если настроен вывод ошибок в браузер, то warning тоже будет телом ответа: $filename= "" $text= file_get_contents( $filename ) // Warning: file_get_contents(): Filename cannot be empty header( ... )

Самым правильным решением большинства проблем с выводом заголовков является изменение структуры РНР файла таким образом, чтобы весь вывод начинался только после того, как отработала основная логика скрипта.
Если же приходится работать с устаревшим кодом где всё вперемешку, можно воспользоваться буферизацией вывода явным образом:
<? ob_start() ?> <?php echo "<body>" header("Content-Type: text/html charset=utf-8") ob_end_flush()
либо настройками php.ini принудить PHP сперва наполнять буфер данными до определенного размера, и лишь потом отдавать содержимое буфера клиенту, но в этом случае превысив размер буфера Вы увидите Выше описываемую ошибку.
output_buffering = 14096