有没有办法让PHP实时将数据打印到Web浏览器?

时间:2008-09-25 15:19:51

标签: php

例如,如果我有一个echo语句,则无法保证浏览器可能立即显示它,可能会一次显示几十个echo语句,并且可能会等到整个页面完成后再显示任何内容。

有没有办法让每个echo在执行时出现在浏览器中?

8 个答案:

答案 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。