【发布时间】:2011-05-22 22:08:28
【问题描述】:
我有这个代码:
<?php
for($i = 0; $i<30; $i++)
{
echo "$i<br>";
usleep(100000);
}
?>
我想知道如何让浏览器显示0,然后1,然后2,...
在我的示例中,它会加载一段时间,然后显示 0-29。
【问题讨论】:
-
我很好奇。你为什么要这样做?
标签: php
我有这个代码:
<?php
for($i = 0; $i<30; $i++)
{
echo "$i<br>";
usleep(100000);
}
?>
我想知道如何让浏览器显示0,然后1,然后2,...
在我的示例中,它会加载一段时间,然后显示 0-29。
【问题讨论】:
标签: php
禁用所有输出缓冲并填充输出:
while(@ob_get_clean());
for($i = 0; $i<30; $i++)
{
echo str_pad("$i<br>",4096);
usleep(100000);
}
此外,如果您的 Apache 使用 mod_deflate 并且您对 text/html 文件进行了 gzip 压缩,这将不起作用。
【讨论】:
.htaccess 文件在本地(而不是在httpd.conf 中)激活它,并将不被压缩的脚本放在不同的目录中。
.htaccess文件实现。在<FilesMatch> 块中,输入RemoveOutputFilter .php。然后mod_deflate不会处理输出。
使用 JavaScript。 HTML 不是交互式控制台。
编辑:那些投反对票的人,请记住我提出了一个实际可行的解决方案。 php 的增量输出在这里绝不是一个有效的解决方案,因为沿途有很多地方可以缓冲它,并且浏览器没有义务在 html 进入时增量地呈现它。
【讨论】:
手动刷新输出缓冲区:
<?php
ob_start();
for($i = 0; $i<30; $i++)
{
echo "$i<br>";
ob_flush();
usleep(100000);
}
?>
【讨论】:
另一种可能更快的方法是做
<?php ob_implicit_flush(true); ?>
告诉 php 在每次输出后刷新输出缓冲区,而不是在正在处理的文件末尾。
【讨论】:
根据我的经验,没有可靠的方法可以让网页实时发送输出数据。
有许多不同的地方可能会出错 - 虽然您可以轻松地让它在单一情况下工作,但总会有其他地方无法解决问题。
最终唯一可靠的解决方案是从 shell 提示符(通过 SSH 或其他方式)执行您的 php 代码,并完全绕过 apache 和 Web 浏览器。
【讨论】:
<?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";
不要让我解释,但这对我有用。
【讨论】: