Я хотел бы, чтобы содержимое страницы для веб-страницы, которую я разрабатываю, появлялось на экране по мере ее загрузки. В моей среде тестирования/разработки это работает, как и ожидалось, с использованием команды PHP flush().
Однако моя производственная установка (WPEngine) использует прокси-сервер Nginx перед Apache, и flush() больше не работает (как и никакие другие команды буферизации вывода). Я смог добиться желаемого поведения, преднамеренно заполнив буфер, когда я хочу сбросить его, отправив пробелы на 4 КБ.
Однако это похоже на взлом, и рассматриваемую страницу необходимо очистить 100 или более раз, поэтому это значительно увеличивает общий объем загружаемых данных.
Есть ли способ подать сигнал Nginx на очистку буфера (или вообще не буферизировать), отправив управляющие символы и/или установив заголовки HTTP, чтобы я мог избежать отправки ненужных пробелов?
Поскольку WPEngine является управляемой средой хостинга, я не могу вносить какие-либо изменения в настройку сервера. Так, например, отключить буферизацию Nginx, добавив директиву в конфиг сервера nginx, не вариант.
В настоящее время я делаю это следующим образом: -
<?php
//turn off server content compression for this page
header('Content-Encoding: none;');
//turn off PHP output buffering
ob_end_flush();
//make padding to fill buffer
$buffer = str_repeat(" ", 4096*8);
$start = time();
do
{
printf( 'Time: %s secs<br>', time() - $start );
echo $buffer;
sleep(1);
} while( (time() - $start) < 10 );
?>
fastcgi_buffering off;
в nginx conf (если вы используете PHP-FPM). Не нужно переполнять буфер, удалите это, просто добавьте flush() после printf. - person Marco Marsala   schedule 05.02.2021