Я ищу вещи, которые могут вызвать следующее предупреждение PHP:
PHP Предупреждение: невозможно изменить заголовок информация - заголовки, уже отправленные Неизвестно в строке 0
Я ищу вещи, которые могут вызвать следующее предупреждение PHP:
PHP Предупреждение: невозможно изменить заголовок информация - заголовки, уже отправленные Неизвестно в строке 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.
Решение состоит в том, чтобы убедиться, что вы удаляете все после закрытия '?>
'