Очистить выходной буфер в настройках Apache/Nginx

Я хотел бы, чтобы содержимое страницы для веб-страницы, которую я разрабатываю, появлялось на экране по мере ее загрузки. В моей среде тестирования/разработки это работает, как и ожидалось, с использованием команды 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 );
?>

person rowatt    schedule 16.11.2013    source источник
comment
здорово! хитрость заключается в том, что ob_end_flush() в начале файла + настройка fastcgi_buffering off; в nginx conf (если вы используете PHP-FPM). Не нужно переполнять буфер, удалите это, просто добавьте flush() после printf.   -  person Marco Marsala    schedule 05.02.2021


Ответы (3)


Вы должны отключить буферизацию в nginx:

proxy_buffering off;

Ссылка: http://nginx.org/r/proxy_buffering

person VBart    schedule 17.11.2013
comment
Спасибо, но есть ли способ сделать это без обновления конфигурации сервера Nginx? - person rowatt; 17.11.2013
comment
Вы читали документы по ссылке, которую я предоставил? Цитата из него: Буферизацию также можно включить или отключить, передав «да» или «нет» в поле заголовка ответа «X-Accel-Buffering». - person VBart; 17.11.2013
comment
Да, но ‹blush› я полностью пропустил этот момент. К сожалению, добавление header('X-Accel-Buffering: no;');, похоже, не отключает буферизацию, что говорит о том, что WPEngine использует proxy_ignore_headers для запрета этого :-( - person rowatt; 17.11.2013
comment
Попробуйте без ; в конце no, я имею в виду: header('X-Accel-Buffering: no'); - person VBart; 17.11.2013
comment
; не имело значения ни в этом отношении, ни в отношении других заголовков, которые работают. WPEngine утверждает, что они не предотвращают это с помощью proxy_ignore_headers, но когда я cURL --head перехожу на тестовую страницу, в то время как другие заголовки, которые я установил, проходят нормально, заголовок X-Accel-Buffering отсутствует. - person rowatt; 18.11.2013
comment
Может быть, они используют сжатие gzip (оно также буферизует ответ)? Попробуйте проверить без заголовка Accept-Encoding. - person VBart; 18.11.2013
comment
Двойной ‹румянец›... Я повторно запустил свой тестовый скрипт, и теперь он работает, как и ожидалось. Я забыл повторно вставить flush() вместо echo $buffer;. header('X-Accel-Buffering: no'); было все, что было нужно. Спасибо за помощь. - person rowatt; 19.11.2013

Хотя уже есть принятый и несколько правильный ответ, стоит отметить, что если вы используете php-fpm, fastcgi_buffering также является проблемой.

Документация неясна, но создание заголовка X-Accel-Buffering: no в вашем ответе отключит fastcgi_buffering, только в >= nginx 1.5.6. Заголовок фактически влияет как на proxy_buffering, так и на fastcgi_buffering, что неясно из документации. .

Поскольку в большинстве дистрибутивов по-прежнему работает серия nginx 1.4, а многие люди используют php-fpm, это потенциальная точка срабатывания (т. е. это повесило меня на час).

person Andy Fowler    schedule 19.04.2014
comment
Добавление заголовка X-Accel-Buffering: no прекрасно работает, когда вы хотите отключить буферизацию для определенного запроса. - person isapir; 28.06.2014

Это может быть проблема с nginx, используйте это в месте, которое буферизуется

fastcgi_keep_conn on;

Если вам нужна помощь, чтобы узнать, куда именно вам нужно поместить это, поделитесь своим файлом конфигурации nginx.

person Mohammad AbuShady    schedule 16.11.2013
comment
Nginx перед Apache вообще не использует fastcgi. - person VBart; 17.11.2013