【问题标题】:Why does PHP send it all at once? [duplicate]为什么 PHP 一次发送所有内容? [复制]
【发布时间】:2012-07-17 16:27:29
【问题描述】:

可能重复:
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); 然后阻塞,而是在所有页面生成之前等待,然后然后一次性发送。它显然破坏了我的“正在加载...”消息的目的,因为它在 2 秒过去之前没有出现。关于为什么以及如何解决这个问题的任何想法?

【问题讨论】:

  • 问题已经关闭,作为关于 output_buffering 的一个副本 - 但是这个问题是关于在服务器完成之前获取内容以在客户端呈现(暗示与输出缓冲相反)

标签: php javascript html


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我已经想到了缓冲区问题。不幸的是,我在第一行添加了ob_start(),并在sleep() 之前添加了flush()ed,它的行为仍然相同。 (还尝试了与ob_flush()ini_set('output_buffering','on')等其他功能的各种组合。)
    • 阅读我的回答,它明确表示这不适用于ob_start。然后阅读documentation,其中明确指出“这意味着您必须同时调用ob_flush()flush() 来刷新ob 输出缓冲区”
    • 知道了,我读的有点快,抱歉。我花了一段时间才了解ob_* 函数之间的关系。它确实适用于ob_flush(); flush();。谢谢!
    猜你喜欢
    • 2017-07-15
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2014-12-15
    相关资源
    最近更新 更多