0

可能重复:
什么是输出缓冲?

我有一些内容需要一段时间才能由 PHP 生成。同时,我想使用这个简单的 JS 技巧来显示“正在加载...”消息。一旦生成输出,该消息就会消失。

<p id="loading_msg">Loading...</p>

<h1>Hello</h1>
<?php
    sleep(2); // This is the greedy function call
    print '<p>This content definitely took a while to be generated !.</p>';
?>

<script type="text/javascript">
    var e = document.getElementById("loading_msg");
    e.style.display = "none";
</script>

问题是,sleep(2);它不会发送所有内容直到阻塞,而是在生成所有页面之前等待,然后一次性发送所有内容。它显然破坏了我的“正在加载...”消息的目的,因为它在 2 秒过去之前没有出现。关于为什么以及如何解决这个问题的任何想法?

4

2 回答 2

4

默认情况下,PHP 将缓冲您的输出并向用户发送较少数量的较大块。您可以使用flush立即将写入缓冲区的内容发送给用户:

<p id="loading_msg">Loading...</p>

<h1>Hello</h1>
<?php
    flush();
    sleep(2);

ob_start如果您之前通过调用php.ini 指令或 php.ini 指令启用了输出缓冲,这output_buffering将不起作用1

于 2012-07-18T15:19:45.127 回答
1

使用 'flush' 可能适用于某些网络服务器/浏览器(meagar 是正确的,在启用输出缓冲时它不会工作 - 但这并不意味着它会在其余时间工作)。

由网络服务器决定何时恢复为分块编码 - 只要您不压缩输出流,大多数将在您调用 flush 时启动分块响应。然后由浏览器决定何时开始呈现不完整的响应 - 并且行为也会因内容而异 - 例如,在表格具有结束标记之前,不会开始呈现表格。

然后尝试在接收页面中处理它的更好的解决方案是在发送页面中处理它 - 例如使用 litebox 来显示消息。或者,消息可以显示在一个临时页面中,该页面重定向到生成的内容。

于 2012-07-18T15:28:25.263 回答