在Apache/Nginx设置中刷新输出缓冲区

row*_*att 7 php nginx output-buffering

我希望我正在开发的网页的页面内容在下载时显示在屏幕上.在我的测试/开发环境中,这可以使用PHP flush()命令按预期工作.

但是,我的生产设置(WPEngine)在Apache前面使用Nginx代理,而flush()不再起作用(也没有任何其他输出缓冲命令).当我想通过发送价值4k的空白来刷新时,我已经能够通过故意填充缓冲区来获得所需的行为.

然而,这感觉就像一个黑客,并且有问题的页面需要刷新100次或更多次,因此这会为下载的总数据增加相当大的数量.

有没有办法通过发送控制字符和/或设置HTTP标头来向Nginx发送信号来刷新缓冲区(或根本不是缓冲区),这样我就可以避免发送其他不必要的空格了?

由于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 );
?>
Run Code Online (Sandbox Code Playgroud)

小智 6

虽然已经有一个接受的答案有点正确,但值得注意的是,如果你使用php-fpm,fastcgi_buffering也是一个问题.

文档不清楚,但X-Accel-Buffering: no在响应中发出标题将禁用fastcgi_buffering,仅在> = nginx 1.5.6中.头实际上似乎既影响proxy_bufferingfastcgi_buffering,这是不是从文档清晰.

由于大多数发行版仍在运行nginx 1.4系列,并且很多人都使用php-fpm,这是一个潜在的跳闸点(即它让我挂了一个小时).


VBa*_*art 3

您应该关闭 nginx 中的缓冲:

proxy_buffering off;
Run Code Online (Sandbox Code Playgroud)

参考: http: //nginx.org/r/proxy_buffering