我有一个脚本并尝试发送分块数据。 为此我在php.ini中禁用output_buffering无法将数据分块发送到浏览器
output_buffering=off
现在
当我运行我的脚本:
echo "stream1";
sleep(5);
echo "stream2";
它显示脚本全部执行后的整个输出,而不是先发送流1 stream2等待浏览器5秒后。
我有一个脚本并尝试发送分块数据。 为此我在php.ini中禁用output_buffering无法将数据分块发送到浏览器
output_buffering=off
现在
当我运行我的脚本:
echo "stream1";
sleep(5);
echo "stream2";
它显示脚本全部执行后的整个输出,而不是先发送流1 stream2等待浏览器5秒后。
尝试如下:
<?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();
}
但首先请告诉我,我应该在尝试脚本之前在php.ini中启用output_buffering。 – Curious
我MOT一个PHP开发人员,但它是有意义的。它是一个后端脚本,它在服务器上工作,其工作方式是执行脚本并将结果发送给客户端。如果你想一个接一个地发送你的数据,你需要你的客户端向服务器发送请求,你的脚本应该发送一部分数据来响应你的请求。 – john
1.你需要flush()来实际发送输出,2.你不能保证浏览器实际上决定立即显示接收的所有内容。 – arkascha
正如你所建议我试图回声“stream1”;冲洗();但它仍然在一起显示stream1stream2。 – Curious