Я бы хотел, чтобы содержимое страницы для веб-страницы, которую я разрабатываю, появляется на экране по мере ее загрузки. В моей среде тестирования / разработки это работает, как ожидается, с помощью команды PHP flush ().
Однако моя производственная установка (WPEngine) использует прокси-сервер Nginx перед Apache и flush () больше не работает (и не выполняет никаких других команд буферизации вывода). Я смог получить желаемое поведение, намеренно заполняя буфер, когда хочу сбросить его, отправив пробел 4k.
Тем не менее, это похоже на взлом, и страница, о которой идет речь, должна быть сброшена 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 ); ?>
Вы должны отключить буферизацию в nginx:
proxy_buffering off;
Хотя уже есть принятый ответ, который является несколько правильным, стоит отметить, что если вы используете php- fastcgi_buffering
, fastcgi_buffering
также является проблемой.
Документация неясна, но излучение X-Accel-Buffering: no
заголовок в вашем ответе не отключит fastcgi_buffering
, только в> = nginx 1.5.6 . Кажется, что заголовок влияет как на proxy_buffering
и на fastcgi_buffering
, что неясно из документов .
Поскольку большинство дистрибутивов по-прежнему работают в nginx 1.4 series, и многие люди используют php-fpm, это потенциальная точка отключения (то есть она повесила меня на час).
Это может быть проблема nginx, использовать ее в буфере
fastcgi_keep_conn on;
Если вам нужна помощь, зная, куда именно вам нужно поместить это, то передайте свой конфигурационный файл nginx.