【发布时间】:2008-09-25 15:19:51
【问题描述】:
例如,如果我有一个 echo 语句,则无法保证浏览器会立即显示它,可能会同时显示几十个 echo 语句,并且可能会等到整个页面完成后再显示任何内容。
有没有办法让每个回显在执行时出现在浏览器中?
【问题讨论】:
标签: php
例如,如果我有一个 echo 语句,则无法保证浏览器会立即显示它,可能会同时显示几十个 echo 语句,并且可能会等到整个页面完成后再显示任何内容。
有没有办法让每个回显在执行时出现在浏览器中?
【问题讨论】:
标签: php
您可以使用flush() 强制将缓冲区内容发送到浏览器。
您可以使用“ob_implicit_flush(true)”启用隐式刷新。
【讨论】:
function printnow($str, $bbreak=true){
print "$str";
if($bbreak){
print "<br />";
}
ob_flush(); flush();
}
如果你传递复杂的对象(或者至少是那些不实现 __toString 的对象),显然这不会起作用,但是你明白了。
【讨论】:
正如其他人指出的那样,除了 PHP 之外,还有一些地方可能会挂起(例如,Web 服务器或客户端的浏览器)。如果您真的想确保信息在可用时显示出来,您可能需要一些基于 AJAX 的解决方案。您将拥有一个处理显示的 PHP 脚本和另一个执行计算的 PHP 脚本,并让显示脚本向另一个发出 AJAX 请求。 jQuery 有一些非常简单的 AJAX 函数,可能会对您有所帮助。
如果浏览器不支持/禁用 JavaScript,您还需要一个后备方案,因为 JavaScript 只是标准页面,可能直到最后才显示内容。
【讨论】:
像 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');
【讨论】:
您可以在 PHP 中调用 flush(),但还有其他几个地方可以保存输出(例如在网络服务器上)。如果您使用输出缓冲,您还需要调用ob_flush()。
您可能还会发现某些浏览器在 HTML 有效之前不会呈现页面,而在所有标签都关闭(如 body、html)之前不会呈现页面
【讨论】:
【讨论】:
flush() 是答案的一部分。然而,至少在一年前,在 Safari 中使用刷新是不可靠的。根据您的情况,我会研究涉及 javascript 的解决方案。也许进度条的各种实现都有可以回收的代码/想法。
【讨论】:
我建议使用 AJAX。
【讨论】: