【问题标题】:Display output in parts in PHP在 PHP 中分部分显示输出
【发布时间】:2011-05-22 22:08:28
【问题描述】:

我有这个代码:

<?php
for($i = 0; $i<30; $i++)
{
    echo "$i<br>";          
    usleep(100000); 
}

?>

我想知道如何让浏览器显示0,然后1,然后2,...

在我的示例中,它会加载一段时间,然后显示 0-29。

【问题讨论】:

  • 我很好奇。你为什么要这样做?

标签: php


【解决方案1】:

禁用所有输出缓冲并填充输出:

while(@ob_get_clean());

for($i = 0; $i<30; $i++)
{
    echo str_pad("$i<br>",4096);          
    usleep(100000); 
}

此外,如果您的 Apache 使用 mod_deflate 并且您对 text/html 文件进行了 gzip 压缩,这将不起作用。

【讨论】:

  • str_pad 的作用是什么?
  • Apache 不会立即发送输出。它以一定大小的块发送;因此填充。
  • 谢谢,这行得通。有没有办法从一个文件中删除 mod_deflate 和 gzip 并让它们在其他文件中工作?
  • 是的。您必须在您想要压缩的目录中使用.htaccess 文件在本地(而不是在httpd.conf 中)激活它,并将不被压缩的脚本放在不同的目录中。
  • 可以通过.htaccess文件实现。在&lt;FilesMatch&gt; 块中,输入RemoveOutputFilter .php。然后mod_deflate不会处理输出。
【解决方案2】:

使用 JavaScript。 HTML 不是交互式控制台。

编辑:那些投反对票的人,请记住我提出了一个实际可行的解决方案。 php 的增量输出在这里绝不是一个有效的解决方案,因为沿途有很多地方可以缓冲它,并且浏览器没有义务在 html 进入时增量地呈现它。

【讨论】:

  • 他问的不是 HTML。这个问题是关于 PHP 的。
  • 他显然是在谈论 html。看到输出中的
    标签了吗?
  • ...然而,它仍然是 PHP。考虑由 PHP 文件处理的非阻塞 FTP 上传。那么它可以是非常互动的。
  • 他想使用 PHP 但他不能。这是一个javascript效果。他需要使用 setTimeout()。 PHP 将呈现他的代码,然后将所有 HTML 一次性发送给客户端。这就是 PHP 在与 Apache 的战斗中所做的。你可以使用 PHP-CLI,它只能在控制台模式下工作。
【解决方案3】:

手动刷新输出缓冲区:

<?php
ob_start();
for($i = 0; $i<30; $i++)
{
    echo "$i<br>";
    ob_flush();
    usleep(100000); 
}
?>

【讨论】:

    【解决方案4】:

    另一种可能更快的方法是做

    <?php ob_implicit_flush(true); ?> 
    

    告诉 php 在每次输出后刷新输出缓冲区,而不是在正在处理的文件末尾。

    【讨论】:

    • 干得好!为我工作。
    【解决方案5】:

    根据我的经验,没有可靠的方法可以让网页实时发送输出数据。

    有许多不同的地方可能会出错 - 虽然您可以轻松地让它在单一情况下工作,但总会有其他地方无法解决问题。

    最终唯一可靠的解决方案是从 shell 提示符(通过 SSH 或其他方式)执行您的 php 代码,并完全绕过 apache 和 Web 浏览器。

    【讨论】:

      【解决方案6】:
      <?php
      header('Content-type: text/html; charset=utf-8');
      @ini_set('zlib.output_compression',0);
      @ini_set('implicit_flush',1);
      @ob_end_clean();
      set_time_limit(0);
      
      echo "Yes";
      sleep(5);
      echo " sir";
      

      不要让我解释,但这对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-25
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        • 2020-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多