У нас есть код, похожий на этот:
<?php ob_implicit_flush(true); ob_end_flush(); foreach ($arrayOfStrings as $string) { echo time_expensive_function($string); } ?>
В Apache это отправляет каждое эхо в браузер по мере его выхода. Однако в nginx / FastCGI это не работает из-за того, что nginx работает (по умолчанию).
Можно ли сделать эту работу на nginx / FastCGI, и если да, то как?
Ни один из вышеперечисленных решений не работал для меня.
Первый php должен правильно очистить все:
@ob_end_flush(); @flush();
Затем я нашел два рабочих решения:
1) Конфигурация через Nginx:
fastcgi_buffering off;
2) Через HTTP-заголовок в php-коде
header('X-Accel-Buffering: no');
Простое решение:
fastcgi_keep_conn on; # < solution proxy_buffering off; gzip off;
Я не хотел отключать gzip для всего сервера или целого каталога, всего лишь для нескольких скриптов, в нескольких конкретных случаях.
Все, что вам нужно, это прежде чем что-либо повторится:
header('Content-Encoding: none;');
Затем выполните флеш как обычно:
ob_end_flush(); flush();
Кажется, что Nginx забирает кодировку, отключенную и не gzip.
Добавьте функцию flush () в ваш цикл:
foreach ($arrayOfStrings as $string) { echo time_expensive_function($string); flush(); }
Это может сработать, но не обязательно на каждой итерации (есть какая-то магия!)
Добавьте -flush в конфигурацию FastCGI, обратитесь к руководству:
http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html#FastCgiServer
http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html#FastCgiConfig
http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html#FastCgiExternalServer
С http://mailman.fastcgi.com/pipermail/fastcgi-developers/2009-July/000286.html