2016-01-07 47 views
0

我有一个脚本并尝试发送分块数据。 为此我在php.ini中禁用output_buffering无法将数据分块发送到浏览器

output_buffering=off 
现在

当我运行我的脚本:

echo "stream1"; 
sleep(5); 
echo "stream2"; 

它显示脚本全部执行后的整个输出,而不是先发送流1 stream2等待浏览器5秒后。

+1

我MOT一个PHP开发人员,但它是有意义的。它是一个后端脚本,它在服务器上工作,其工作方式是执行脚本并将结果发送给客户端。如果你想一个接一个地发送你的数据,你需要你的客户端向服务器发送请求,你的脚本应该发送一部分数据来响应你的请求。 – john

+1

1.你需要flush()来实际发送输出,2.你不能保证浏览器实际上决定立即显示接收的所有内容。 – arkascha

+0

正如你所建议我试图回声“stream1”;冲洗();但它仍然在一起显示stream1stream2。 – Curious

回答

0

尝试如下:

<?PHP 
ob_start(); 

echo 'Output one.'; 
ob_flush(); 
sleep(5); 
echo 'Output two.'; 
ob_flush(); 
?> 

我觉得它更是一个HTTP请求/响应的问题。在命令行上,脚本工作正常。

正常情况下,响应已准备完毕并发送给客户端。如果您的响应的大小必须发送多个tcp包,则可能会在脚本准备好处理之前发送第一个包。所以它取决于输出的大小。根据客户端/网络浏览器的不同,在完整的响应到达客户端之前,也可能会发生第一个包被渲染的情况。

尝试下面的脚本:

header('Content-type: text/html; charset=utf-8'); 
header("Cache-Control: no-cache, must-revalidate"); 
header ("Pragma: no-cache"); 
set_time_limit(0); 
ob_implicit_flush(1); 
for ($i = 0; $i < 10; $i++) { 
    $randSlp=rand(1,3); 
    echo "Sleeping for ".$randSlp." second. ";; 
    sleep(1); 
    if(ob_get_level()>0) 
     ob_end_flush(); 
} 
+0

但首先请告诉我,我应该在尝试脚本之前在php.ini中启用output_buffering。 – Curious

相关问题