有没有办法让PHP实时将数据打印到Web浏览器?
例如,如果我有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');