30

Не сохраняются куки. Что не так.

Ошибка

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

sanmai
  • 12,320
Vlmake
  • 1,061
  • 4
    значит перед этим было что то выведено. Проверьте классические проблемы
    • перед первым <?php нет пробелов или пустых строк.
    • после последнего ?> нет пробелов или пустых строк.
    • Ваш код не выводит с помощью echo/pring что то до установки кук
    • что текст сохранен без BOM. Если Вы пользуетесь блокнотом или подобным, то они могут добавлять в начало, если сохраняете в UTF-8.
    – KoVadim Dec 29 '13 at 21:45
  • Классические проблемы - перед первым <?php нет пробелов или пустых строк. После последнего ?> нет пробелов или пустых строк. – Решил проблему, были пустые строки после ?>. –  Aug 25 '16 at 06:45

3 Answers3

50

Общение WEB-сервера с клиентом в данном случае происходит по протоколу HTTP. HTTP включает в себя HTTP заголовки и тело ответа. При этом заголовки обязательно следуют перед телом ответа – того требует стандарт.

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

  Warning: Cannot modify header information - headers already sent by (output started at ...

Это может быть следствием следующих причин:

  1. Перед установкой заголовков был вывод тела ответа. При этом вывод может быть осуществлен как средствами шаблонизатора, так и через функции echo или print

    <html> // вывод средствами шаблонизатора
    <?php
        echo "<body>"; // вывод средствами оператора
        header( "Content-Type: text/html; charset=utf-8" );
    
  2. Вы можете банально ошибиться и поставить перед <? пробелы или переносы строк, которые тоже будут восприняты как тело ответа.

  3. Ровно так же как и в пункте 2, но в конце php-файла:
    Файл incrementX.php

    <?php
    $x++;
    ?>[пробел][перенос строки]
    

    Файл index.php

    <?php
    include( "incrementX.php" );
    header( ... );
    
  4. Файлы, которые содержат PHP-код должны быть сохранены без BOM. Как сохранить файл без BOM.

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

     include( "include.inc" ); // include.inc может формировать тело ответа  
     header( ... );
    
  6. Если настроен вывод ошибок в браузер, то warning тоже будет телом ответа:

     $filename= "";
     $text= file_get_contents( $filename ); // Warning: file_get_contents(): Filename cannot be empty
     header( ... );
    

Самым правильным решением большинства проблем с выводом заголовков является изменение структуры РНР файла таким образом, чтобы весь вывод начинался только после того, как отработала основная логика скрипта.

Если же приходится работать с устаревшим кодом где всё вперемешку, можно воспользоваться буферизацией вывода явным образом:

    <? ob_start();?>
    <html>
    <?php
        echo "<body>";
        header("Content-Type: text/html; charset=utf-8");
        ob_end_flush();

либо настройками php.ini принудить PHP сперва наполнять буфер данными до определенного размера, и лишь потом отдавать содержимое буфера клиенту, но в этом случае превысив размер буфера Вы увидите Выше описываемую ошибку.

    output_buffering = 14096 
ReinRaus
  • 17,873
  • 3
  • 47
  • 86
  • а можно, дабавить в php.ini output_buffering = 14096

    и ничего не делать :)

    но вообще да, таких ситуаций быть не должно

    – Alex Kapustin Dec 30 '13 at 09:23
  • а в один день запишете 14097 байт и будете долго ломать голову.

    но вообще да, таких ситуаций быть не должно

    вообще то это родовая травма php...

    – KoVadim Dec 30 '13 at 10:00
  • а в один день запишете 14097 байт и будете долго ломать голову.

    в последних версиях пхп - оно по умолчанию установлено

    – Alex Kapustin Dec 31 '13 at 06:34
  • Обсуждали в чате (раз и два), не стоит ли навесить на этот вопрос метку php-faq и использовать ваш ответ как эталонную закрывашку для подобных вопросов по ошибке cannot modify header info. Не возьмётесь ли дополнить свой ответ ссылкой на http://cannot-modify-header-information.ru/ и дописать (с него или другого сайта) недостающую информацию? – A K Jan 20 '17 at 07:35
  • Добавляйте, если считаете нужным... Я просто не оттуда брал информацию, а из головы, ну и мой ответ рассматривает больше типичных ошибок, чем обозначенный сайт. – ReinRaus Jan 20 '17 at 12:39
6

у вас что-то эхнуто перед отправкой хедера ...main_noauth.php on line 58.... Посмотрите в строчке 58

Kirill
  • 9,126
0

В php.ini

output_buffering = On

И всё работает

  • Присоединяюсь к Олегу. Была такая же проблема с запуском приложения на yii(advanced) После включения буферизации в настройках php проблема исчезла – Pvokinsark Jul 24 '19 at 04:44