我希望我正在开发的网页的页面内容会在下载时显示在屏幕上。在我的测试/开发环境中,这可以使用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 );
?>
答案 0 :(得分:5)
虽然已经接受的答案有点正确,但值得注意的是,如果您使用php-fpm,fastcgi_buffering
也是一个问题。
文档不清楚,但在您的回复中发出X-Accel-Buffering: no
标题将仅在&gt; = nginx 1.5.6 中禁用fastcgi_buffering
,。标题实际上似乎同时影响proxy_buffering
和fastcgi_buffering
isn't clear from the docs。
由于大多数发行版仍在运行nginx 1.4系列,并且很多人都使用php-fpm,这是一个潜在的跳闸点(即它让我挂了一个小时)。
答案 1 :(得分:2)
答案 2 :(得分:0)
这可能是一个nginx问题,在缓冲的位置使用它
fastcgi_keep_conn on;
如果你需要帮助知道你需要把它放在哪里,然后分享你的nginx配置文件。