Почему я не получаю "Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены", как я ожидал получить?
Я использую PHP 7.1.11 на машине, которая работает под управлением Windows 10 Home Single Language.
Я использую сервер XAMPP на моей машине.
Я использую следующие браузеры на этой машине:
- Google Chrome (версия 62.0.3202.94 (официальная сборка) (64-разрядная версия))
- Firefox Quantum (57.0.1 (64-разрядная версия))
- Opera (Версия: 49.0.2725.47)
- Microsoft Edge 41.16299.15.0
Я знаю детали header()
функция и как это работает.
Но следующая программа ведет себя очень странно во всех четырех вышеперечисленных браузерах. Даже после отправки вывода клиенту функция header () работает.
Как это может быть возможным?
Ниже приведен мой код (он перенаправляется на указанный мной URL):
<!DOCTYPE html>
<html>
<body>
<p>Welcome to my website!</p><br />
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
if($test) {
echo 'Welcome to my website<br />You\'re in!';
} else {
header('Location: http://www.espncricinfo.com');
}
?>
</body>
</html>
Я ожидал получить предупреждение "Невозможно изменить информацию заголовка - заголовки уже отправлены", но неожиданно меня перенаправили на URL http://www.espncricinfo.com/
?
Зачем?
1 ответ
Если вы как-то используете буферизацию вывода - либо вручную, либо из-за того, что ваш PHP настроен на автоматическое выполнение этого, - вам все равно разрешается добавлять заголовки, если исходный буфер не был очищен.
Что делает выходная буферизация, это то, на что намекает имя: поместите вывод в буфер, который будет отправлен на более позднем этапе, вместо немедленного вывода данных. Из-за этого, пока не отправлены данные тела сообщения ответа HTTP, вы все равно можете отправлять данные заголовка.
Чтобы проверить, настроен ли PHP для автоматической буферизации вывода, вы можете выполнить одно из следующих действий:
- проверьте файл конфигурации php.ini и найдите строку
output_buffering
var_dump( ini_get( 'output_buffering' ) );
phpinfo();
(сбрасывает всю конфигурацию) и ищет строкуoutput_buffering
Если выходная буферизация включена, значением будет либо размер буфера в байтах (если настроен как таковой), либо "On"
или же true
, Или что-то в этом роде.