例如,如果我有一个echo语句,则无法保证浏览器可能立即显示它,可能会一次显示几十个echo语句,并且可能会等到整个页面完成后再显示任何内容。
有没有办法让每个echo在执行时出现在浏览器中?
答案 0 :(得分:10)
您可以使用flush()
强制将缓冲区内容发送到浏览器。
您可以使用“ob_implicit_flush(true)
”启用隐式刷新。
答案 1 :(得分:8)
function printnow($str, $bbreak=true){
print "$str";
if($bbreak){
print "<br />";
}
ob_flush(); flush();
}
显然,如果你传递复杂的对象(或者至少那些没有实现__toString的对象),这种情况就不会发生,但是,你明白了。
答案 2 :(得分:2)
正如其他人所指出的那样,除了PHP(例如,Web服务器或客户端的浏览器)之外,还有一些地方可能会被挂起。如果您确实希望确保信息在可用时显示,则可能需要一些基于AJAX的解决方案。您将拥有一个处理显示的PHP脚本和另一个执行计算的PHP脚本,并让显示脚本向另一个执行AJAX请求。 jQuery有一些非常简单的AJAX函数可以帮助你。
如果浏览器不支持/已禁用JavaScript,那么您也希望有一个后备版本,这只是标准页面,可能直到最后才显示内容。
答案 3 :(得分:1)
您可以在 PHP 中调用flush()
,但还有其他几个地方可以保留输出(例如,在网络服务器上)。如果您正在使用输出缓冲,则还需要调用ob_flush()
。
您可能还会发现某些浏览器在HTML无效之前不会呈现页面,直到所有标记都关闭(如body,html)
答案 4 :(得分:1)
启用隐式刷新作为blueyed表示应该这样做,因为它在每个echo之后调用flush,但是某些浏览器也需要设置no-cache头。这是我使用的。您的里程可能因浏览器而异。
header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header('Pragma: no-cache');
答案 5 :(得分:0)
答案 6 :(得分:0)
flush()是答案的一部分。至少在一年前,在Safari中使用flush是不可靠的。根据您的情况,我会研究涉及javascript的解决方案。也许进度条的各种实现都有可以回收的代码/想法。
答案 7 :(得分:0)
我建议使用AJAX。