我有一个长时间运行的脚本,并希望使用输出缓冲定期向浏览器发送输出。
我感到很困惑,因为我已经在这里读了很多问题,据说要用这个:
while (...) {
ob_start();
// echo statements
ob_end_flush();
}
但这对我没有用。我也试过这个:
while (...) {
ob_start();
// echo statements
ob_flush();
flush();
ob_end_flush();
}
但那也没有用。似乎唯一有效的是:
while (...) {
ob_end_clean();
ob_start();
// echo statements
ob_flush();
flush();
}
为什么我必须先调用ob_end_clean()
才能使输出缓冲起作用?
答案 0 :(得分:2)
你做错了。这样就可以了:
while (...) {
// echo statements
flush();
}
确保您的Web服务器配置为在没有自己的缓存的情况下委派输出。如果您希望稍后以字符串形式获取输出,则仅需要输出缓冲区ob_start
。
另请查看ob_implicit_flush
,它会在输出时自动执行刷新。
答案 1 :(得分:2)
可能这取决于你的其余代码。
对我来说,以下代码没有问题:
<?php
header( 'Content-type: text/html; charset=utf-8' );
$x = 1;
while ($x < 10) {
echo $x."<br />";
ob_flush();
flush();
sleep(1);
++$x;
}
您可以使用ob_implicit_flush()
,但每次运行flash()
时都不需要运行ob_flush()
,因此以上代码可以更改为:
<?php
header( 'Content-type: text/html; charset=utf-8' );
$x = 1;
ob_implicit_flush(true);
while ($x < 10) {
echo $x."<br />";
ob_flush();
sleep(1);
++$x;
}
您还应该查看header()
。如果在上述任何代码中我删除/注释行标题,则脚本结束执行后将显示所有内容。输出缓冲无法按预期工作