调用ob_flush()和flush(),但在脚本完成之前,浏览器不会显示任何输出

DJa*_*ari 19 php output-buffering

嗨,请查看以下代码:

<?php
ob_start();

echo "Start ...<br />\n";
for( $i = 0 ; $i < 10 ; $i++ )
{
    echo "$i<br />\n";
    ob_flush(); 
    flush();
    sleep(1);
}
echo "End ...<br />\n";
?>
Run Code Online (Sandbox Code Playgroud)

这是不正确的?我测试了它,但我的输出显示脚本完成后,有任何解决方案吗?

小智 15

嘿,我也陷入了这个问题,最后得到了正确的解决方案,这是给你的

您必须通过两种方式为页面添加内容类型1.使用html标记

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
Run Code Online (Sandbox Code Playgroud)

防爆.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Wp Migration</title>
</head>
<body>
<?php 
for($i=0;$i<70;$i++)
{
echo 'printing...<br>';
ob_flush();
flush();
sleep(3);
}
?>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
  1. 使用php头功能

    <?php header( 'Content-type: text/html; charset=utf-8' ); ?>

防爆.

<?php 
header( 'Content-type: text/html; charset=utf-8' );
for($i=0;$i<70;$i++)
{
echo 'printing...<br>';
ob_flush();
flush();
sleep(3);
}
?>
Run Code Online (Sandbox Code Playgroud)

祝一切顺利


Jür*_*len 6

某些浏览器在开始渲染之前需要至少接收256个字符.您是否已尝试填充更多输出:

echo str_repeat('&nbsp;', 50) . "$i<br />\n";
Run Code Online (Sandbox Code Playgroud)

编辑:

Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9我能够通过设置重现OP的问题

zlib.output_compression = On
Run Code Online (Sandbox Code Playgroud)

再次关闭它

zlib.output_compression = Off
Run Code Online (Sandbox Code Playgroud)

使脚本按需运行.


Pas*_*TIN 4

尝试删除第一行的调用ob_start():您不需要启用输出缓冲 - 它可能会在这里引起麻烦。


我已经测试了你的代码:

  • 如果ob_start()在第一行调用,我只会在脚本完成(10 秒后)时看到输出
  • 如果我删除对 的调用ob_start(),那么,只要它显示在标准输出上,我就会每秒看到一行输出。