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

Why does PHP send it all at once?

本文关键字:一次 PHP 为什么      更新时间:2023-11-05

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

我有一些内容需要一段时间才能由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秒之前不会出现。有什么想法吗?我该如何解决这个问题?

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

<p id="loading_msg">Loading...</p>
<h1>Hello</h1>
<?php
    flush();
    sleep(2);

如果您以前通过调用ob_start或php.ini指令output_buffering1来启用输出缓冲,那么这将不起作用。

在某些Web服务器/浏览器上使用'flush'可能会起作用(meachar正确地说,在启用输出缓冲时它不会起作用,但这并不意味着它会在其余时间起作用)。

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

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