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

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

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

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

ob_start("ob_gzhandler"); 

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

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

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


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

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.

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