PHP:
header('Content-type: text/plain'); for ($i=0; $i<10; $i++){ echo "$i\r\n"; ob_flush(); flush(); sleep(1); }
我在2个不同的服务器上面试过脚本。 两者都在每行响应数字0 … 9。 在第一台服务器的情况下,每秒钟都会收到一个号码。 在第二台服务器的情况下,10秒内没有输出,并且整个输出一次显示。 什么可能是错误的第二种情况? 我试过各种uutput控制function,但没有帮助。
在这两种情况下的响应头集合几乎是相同的:
HTTP/1.1 200 OK Date: Mon, 03 Jan 2011 19:21:21 GMT Server: Apache X-Powered-By: PHP/5.2.14 Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/plain
您需要在php.ini中将output_buffering设置为“Off”,然后重新启动apache,output_buffering的默认值为4096,防止您的ob_flush()和flush()生效。 你也缺less一个ob_start(); 在您的示例代码的开始。
output_buffering =closures
输出缓冲可以在运行时调用, 或默认启用(如第二台服务器)。
运行<?php var_dump( ini_get('output_buffering') ); ?> <?php var_dump( ini_get('output_buffering') ); ?>或<?php phpinfo(); ?> 看看它是否在你使用的服务器上启用。
参考:PHP手册
当PHP刷新缓冲区时,与Web服务器决定写入输出无关,Web服务器可能会推送部分响应(相对罕见),或者如您的情况,分块响应。 Web服务器不提供直接控制输出stream的function。 他们也不应该。 在PHP中使用输出缓冲只是稍微推迟分块。
如果你想在代码仍在运行的时候在浏览器中生成输出,那么这就不是这样做的 – 分离一个独立的进程(最好在一个新的会话组中)并且向浏览器写一个存根响应 – 然后发送更新到使用Ajax的存根(可选地与长轮询)。