Предупреждение PHP: заголовки уже отправлены в неизвестном

Я ищу вещи, которые могут вызвать следующее предупреждение PHP:

Предупреждение PHP: Невозможно изменить информацию заголовка - заголовки, уже отправленные в Unknown в строке 0

5 ответов

Решение

Оказалось, что это была линия

ob_start("ob_gzhandler");

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

Это может быть много вещей, но, как говорили другие, часто это просто пространство, лежащее где-то вокруг, которое выводится, а затем header() Команда отправляется, что обычно нормально, но не после начала отправки контента обратно (в данном случае, возможно, это просто пробел).

С помощью ob_start() останавливает выходной поток сразу же путем его буферизации. Так что это потенциальное решение, или, по крайней мере, способ диагностировать, откуда оно, как сказал Зодей.


В этом сценарии есть одна общая вещь, которая приводит к потере пробелов.

global.php

<?php
  $variable = 1;
  $database = 'something else';
?> <-- A space here
 <-- Or here

index.php

<?php

  require('global.php');
  $var = dosomething();
  header('Location: http://www.example.com/');

?>

Один из способов исправить это - удалить?> В конце файла global.php. Они вам не нужны, они полезны только в том случае, если вы начнете размещать HTML, например, после кода PHP. Итак, у вас будет:

<?php
  $variable = 1;
  $database = 'something else';

И когда вы делаете require() пространство не выводится до header(),


Просто чтобы проиллюстрировать проблемы с выводимым контентом и заголовками, это еще один распространенный случай, который дает похожую ошибку. Это происходит, когда вы забыли остановить обработку после перенаправления с помощью header(),

if ($notLoggedIn) {
  header('Location: http://www.example.com/login.php');
}
echo 'Welcome to my website'; // this will be outputted, 
                              // you should have an exit() 
                              // right after the header()

Я думаю, что происходит, когда одна из встроенных функций php выводит что-то. Я видел это с парой функций IMAP, где они помещают просто " " (пробел), и это все портит. Вы можете отследить его, используя Xdebug или Zend-отладчик, но если у вас нет попыток обернуть буферизацию вывода вокруг некоторых функций, которые, по вашему мнению, могут быть причиной этого.

ob_start();
callYourFunction();
ob_end_clean();

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

Редактировать: тот факт, что ваш вывод происходит в строке 0, означает, что вывод выполняется функцией уровня C, а не кодом, написанным с использованием PHP.

Вы проверили свои файлы на непреднамеренные спецификации UTF-8?

Ошибка говорит вам, что что-то отправило вывод, что заставило бы отправлять заголовки, потому что заголовки должны быть записаны перед телом http-сообщения.

Самая распространенная проблема, которую я нашел, - это текст в заголовках. визави:

<?php // myfile.php
  include 'header.php';
?>

и в header.php:

<?php // header.php
   ....
 ?>

То, что вы не видите здесь, это то, что есть пробел - либо пробел, либо CR/LF после закрытия "?>". Это вывод, потому что стандарт php говорит, что все, что находится за пределами тегов php, выводится как html.

Решение состоит в том, чтобы убедиться, что вы удалите все после закрытия?>'

Другие вопросы по тегам