Почему мой код не вызывает предупреждение об уже отправленных заголовках?

Я всегда думал, что PHP не позволяет отправлять заголовки после любого вывода. Я был удивлен, увидев, что это не вызывает ошибок в моем коде:

<?php

echo 'z';
header('X-Foo: Bar');
echo 'y';

Что он делает, так это выводит заголовки zy и X-Foo: Bar просто отлично. Как это возможно? Я не использую буферизацию вывода.

Может ли буферизация вывода быть включена сервером по умолчанию? Или, может быть, PHP изменил способ буферизации вывода по умолчанию? Я использую PHP 7.3.4. И да, все мои ошибки, предупреждения и уведомления настроены на отображение.

Я использую сервер Homestead, возможно, это послужит подсказкой.


person Robo Robok    schedule 29.05.2019    source источник
comment
@DerekPollard Прочитайте вопрос еще раз. ОП это знает. ОП задается вопросом, почему это (очевидно) работает, когда не должно.   -  person ceejayoz    schedule 29.05.2019
comment
на моей версии 7.3.3 выдает ошибку   -  person Derek Pollard    schedule 29.05.2019
comment
Я сталкивался с этим явлением в определенных средах разработки, но никогда не вникал, почему оно не выдавало уведомление... Мне любопытно, что вы обнаружите. (Обратите внимание, это было верно для меня в прошлом на PHP 5.6, еще не сталкивался с этим в 7.2)   -  person random_user_name    schedule 29.05.2019
comment
Он также должен запуститься Warning в вашей версии. См. 3v4l.org/EGrXp.   -  person Always Sunny    schedule 29.05.2019
comment
Я бы посмотрел на php.net/manual/en/outcontrol.configuration. php. Можно включить буферизацию вывода на уровне php.ini. OP упоминает Homestead - этот код находится в Laravel?   -  person ceejayoz    schedule 29.05.2019
comment
@ceejayoz Нет, это чистый необработанный сценарий. Но я использую сервер Laravel — Homestead. Может быть, это делает что-то за кулисами.   -  person Robo Robok    schedule 29.05.2019
comment
echo ini_get('output_buffering'); выводит 4096. Означает ли это, что Homestead включает его по умолчанию?   -  person Robo Robok    schedule 29.05.2019
comment
@RoboRobok Я не могу говорить за Homestead (в основном я использую Valet), но похоже, что это ваш ответ. Мне не сразу ясно из репозитория Github laravel/homestead, устанавливает ли он значения по умолчанию для PHP.   -  person ceejayoz    schedule 29.05.2019
comment
У меня тоже отлично работает, но добавление flush(); после эха 'z'; Я получаю сообщение об ошибке "Заголовок уже отправлен". Итак, по какой-то причине (возможно, из-за конфигурации сервера) эхо не отправляется напрямую на вывод.   -  person José Carlos PHP    schedule 29.05.2019
comment
@JoséCarlosPHP, вы используете Homestead, как я?   -  person Robo Robok    schedule 30.05.2019
comment
@RoboRobok Нет, я использую xampp.   -  person José Carlos PHP    schedule 31.05.2019


Ответы (1)