Как сразу отправлять заголовки HTTP/2 при использовании PHP-FPM и Apache

Кажется, я не могу сразу отправлять заголовки из PHP при работе в качестве FPM. Они отправляются только в конце запроса вместе с контентом.

У меня есть установка Apache + PHP-FPM. Я отключил сжатие вывода в PHP и Apache.

Я даже просмотрел поток TCP-соединения, используя tcpdump -nn -i any -A -s 0 port 9000, и увидел, что PHP не отправляет заголовки Apache до конца, поэтому проблема связана с настройкой PHP.

См. ниже тестовый код, который я использую.


header('Status: 200 OK');
header('Content-type: text/html; charset=utf-8');

header('Link: </src/app/src/App/Ui/Layout/default.css?__mtime=1553684041>; rel=preload; as=style;', false);

flush();

header('Test: 1', false);
sleep(5);
header('Test2: 2', false);

echo 'test';

Я бы ожидал, что заголовок Link: будет отправлен до конца запроса, то есть до строки 'test', но это не так. Все заголовки отправляются в конце запроса после 5 секундной задержки.

Что я делаю не так?


person phpcoder    schedule 28.03.2019    source источник
comment
Вероятно, вы ищете ob_flush.   -  person Dave    schedule 28.03.2019
comment
@Dave Дэйв тоже не работает.   -  person phpcoder    schedule 28.03.2019
comment
Не знаю, почему это не работает, но когда-нибудь задумывались об использовании для этого 103?   -  person Barry Pollard    schedule 28.03.2019
comment
@BarryPollard PHP does not support 103 Early Hints, because it doesn’t have a native ability to send more than 1 status code back to a client - https://evertpot.com/http/103-early-hints   -  person phpcoder    schedule 29.03.2019


Ответы (1)


По умолчанию fastcgi_buffering установлено на on.

Вам нужно добавить: fastcgi_buffering off; в соответствующий блок location.

person BartVB    schedule 14.01.2020