为什么PHP会一次性发送所有内容?

时间:2012-07-18 15:18:45

标签: php javascript html

  

可能重复:
  what is output buffering?

我有一些内容需要一段时间才能生成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);然后阻止,它会在生成所有页面之前等待,而然后,一次性发送 / strong>即可。它显然打破了我的“正在加载...”消息的目的,因为它在2秒之前没有出现。关于为什么以及如何解决这个问题的任何想法?

2 个答案:

答案 0 :(得分:4)

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

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

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

如果您之前通过调用ob_start或php.ini指令output_buffering1启用了输出缓冲,则无效。

答案 1 :(得分:1)

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

由Web服务器决定何时恢复分块编码 - 只要您不压缩输出流,大多数将在您调用flush时启动分块响应。然后由浏览器决定何时开始呈现不完整的响应 - 并且行为也将根据内容而变化 - 例如none将开始渲染表,直到它具有结束标记。

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