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

时间:2020-03-06 14:43:35  来源:igfitidea点击:

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

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

解决方案

在这里开始调查:

http://httpd.apache.org/docs/1.3/misc/FAQ-F.html#nph-scripts

我们可以在PHP中调用flush(),但是在其他几个位置也可以保存输出(例如,在网络服务器上)。如果使用输出缓冲,则还需要调用" ob_flush()"。

我们可能还会发现,某些浏览器在HTML有效之前将不会呈现页面,而在所有标签都关闭之前(例如body,html)

我们可以使用flush()强制将缓冲区内容发送到浏览器。

我们可以使用"ob_implicit_flush(true)"启用隐式刷新。

function printnow($str, $bbreak=true){
    print "$str";
    if($bbreak){
        print "<br />";
    }
    ob_flush(); flush();
}

显然,如果我们将复杂的对象(或者至少是那些没有实现__toString的对象)传递给它,这种行为就不会发生,但是我们明白了。

flush()是答案的一部分。至少直到一年前,在Safari中使用flush还是不可靠的。根据情况,我将研究涉及javascript的解决方案。也许进度条的各种实现都有可以回收的代码/想法。

正如其他人指出的那样,除了PHP(例如,网络服务器或者客户端的浏览器)之外,还有很多地方可以挂断东西。如果我们确实想确保在可用时显示信息,则可能需要一些基于AJAX的解决方案。我们将拥有一个处理显示的PHP脚本,另一个处理计算的PHP脚本,并使显示脚本向另一个脚本发出AJAX请求。 jQuery具有一些非常简单的AJAX函数,可能会对我们有所帮助。

如果浏览器不支持/禁用了JavaScript,那将是后备之选,而JavaScript只是到最后才显示内容的标准页面。

我建议使用AJAX。

如blueyed所说,启用隐式刷新应该可以解决问题,因为它在每次回显后都会调用刷新,但是某些浏览器还要求设置无缓存头。这是我用的。里程可能会因浏览器而异。

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');