ob_start();    
for ($i = 0; $i < 100; $i++) {    
  echo "waiting...<br>";    
  flush();    
  ob_flush();    
  sleep(1);    
}    
ob_end_flush(); 以上这段代码怎么不是慢慢输出的,而是一次就输出了啊???

解决方案 »

  1.   

    这与浏览器有关. 
    在ie6,ff2,ff3,我下面的代码可以执行.
    但要求php.ini output_buffering = Off才行.这个就当是玩就行了,没有什么实际意义.ob_end_clean();
    ob_implicit_flush(true);
    for ($i=10; $i>0; $i--)
    {
      echo $i . "<br/>";
      sleep(1);
    }
      

  2.   

    还是不行,是不是php或者apache哪里要设置啊?我也是IE6
      

  3.   

    IE6新开的窗口,前256个字节是不立即显示的。你先输出一段无用文字就可以了。ob_end_clean();
    ob_implicit_flush(true);
    for($i=0;i<26;$i++) echo "<span></span>";for ($i=10; $i>0; $i--)
    {
      echo $i . "<br/>";
      sleep(1);
    }
      

  4.   

    php.ini output_buffering = Off已经设置了
      

  5.   

    虽然是很老前的话题了,还是帮忙给楼上的各位纠正下吧,以免误导后生首先,可以确定,php.ini output_buffering = Off这样的做法是完全错的(看来都没搞清楚ob的用途)这只是关闭缓冲区,关闭缓冲区当然会把内容推送到浏览器,但绝不推荐这样的,缓冲区在绝大部分时候是很有用的。正确的代码应该如下:<?php
    ignore_user_abort(true);
    header( 'Content-Type: text/html;charset=utf-8' );
    echo 'begin...<br>';
    flush();  //直接推送到浏览器
    for($i=0;$i<10;$i++)
    {
        echo 'loading '.$i.'0%<br>';
        // 如果浏览器已关闭
        if ( connection_aborted() )
        {
            exit;  //如果希望关了浏览器后程序继续执行,把这行去掉即可
        }
        flush();
        sleep(1);
    }echo 'ok';
    经实验,上面的header是必须的,否则浏览器还是会到执行完毕才显示。
    用的是flush,而并非ob_的方法,flush可以把内容直接推送到浏览器,而ob只是推送到apache的缓冲区
      

  6.   

    再补充下,刚发现IE6里有问题,输出一定长度的空格即可解决,完整代码如下:
    <?php
    ignore_user_abort(true);
    header( 'Content-Type: text/html;charset=utf-8' );
    echo str_pad("",1000);   //输出1000个空格
    echo 'begin...<br>';
    flush();
    for($i=0;$i<10;$i++)
    {
        echo 'loading '.$i.'0%<br>';
        if ( connection_aborted() )
        {
            exit;
        }
        flush();
        sleep(1);
    }echo 'ok';
      

  7.   

    你应该将ob_flush 和 flush 一起用吧
    服务器端设置了缓存的话  只有flush应该无法立即推送到浏览器端的
      

  8.   

    本帖最后由 xuzuning 于 2011-07-05 19:40:04 编辑