php ob_flush,flush在ie中缓冲无效的研究自己写了个小例子,想在页面每隔一秒输出一个数字。按照网上的代码:
ob_end_clean();
for ($i=10; $i>0; $i--)
{
 echo $i;
 flush();
 sleep(1);
} 或者:
for ($i=10; $i>0; $i--)
{
 echo $i;
 ob_flush();
 flush();
 sleep(1);
}  我发现在火狐里面生效,但在IE里不起作用,每次都是10个数字一起输出,这说明缓冲没有生效。我又开始调整php.ini里面的output_buffering的设置,重启apache,依旧无效。然后我看到了一段话:一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。 罪恶的IE浏览器,问题就是TMD的多! 然后我修改了下程序,便正常了:
    echo  str_pad('',4096);
    for ($i = 0; $i < 10; $i++) {
            echo $i;
            ob_flush();
            flush();
            sleep(1);
    }---------------------------------------------------------------------------------------------
我按照上面的例子,连火狐都无法实现每隔一秒输出

解决方案 »

  1.   

    可以的,我看了别人的演示页面.应该是php.ini需要设置
      

  2.   

    效果如下
    http://www.kenescat.com/files/source/php/20100428_001.php
      

  3.   

    呵呵,我当初记得好像是php的某种机制限制的,不知道解决方法
      

  4.   

    ignore_user_abort(true);
    set_time_limit(0); 
    function seeme(){
    sleep(1);
    echo "HELLO!".date('h:i:s')."<br>";
    }ob_end_clean();
    ob_start();while(1){ ob_flush();
    flush();
    seeme();
    }
      

  5.   


    ignore_user_abort(true);
    set_time_limit(0);  
    function seeme(){
    sleep(1);
    echo "HELLO!".date('h:i:s')."<br>";
    }//ob_end_clean();
    ob_start();while(1){ob_flush();
    flush();
    seeme();
    }
    这个是可以的,和你看的那个都一样,前几个一下就出来了,不过后面的是一个一个的
      

  6.   

    lz你的
    for ($i=10; $i>0; $i--)
    {
     echo $i;
     ob_flush();
     flush();
     sleep(1);
    }
    在我这里运行良好 fx和ie都很好  我ie8
      

  7.   

    while(1){ob_flush();
    flush();
    seeme();
    }
    这个不行,而且你是死循环的,永远出不来,所以是php.ini的设置问题吧
      

  8.   

    死循环无所谓啦  只是试一试  你可以在浏览器把它停掉的
    我是xampp的默认配置
      

  9.   

    哪位好心给我发一个php.ini好吧, [email protected]
      

  10.   

    到最后while(1){
    flush();
    sleep(1);
    echo "HELLO!".date('h:i:s')."<br>";
    }
      

  11.   

    kyzy_yy_pm
    给发个php.ini吧,[email protected],我的是虚拟主机
    多谢了
      

  12.   

    <?   
      ob_start();ob_end_flush();   
      ob_implicit_flush();   
        
      for($i   =   1;   $i   <=   300;   $i++   )   print("   ");   
        
      for($i   =   1;   $i   <=   5;   $i++   )   {   
      echo   "a<br>";sleep(1);   
      }   
    试一试
      

  13.   


    ignore_user_abort(true);
    set_time_limit(0); 
    ob_end_clean();
    ob_start();//开始缓冲数据
    while(1){
        echo str_repeat(" ",1024);//ie有默认的1k buffer
        ob_flush();
        flush();
        echo "hello----------";
        echo date('h:i:s') . "<br>";
        usleep(1000000);
    }
      

  14.   

    虚拟服务器供应商的回复是
    The problem that you will run into on our hosting is the fact that we dynamically turn on and turn off mod_deflate, depending on how busy the server is. If the server has enough free CPU resources, it will automatically gzip-compress responses generated from php scripts. gzip compression needs and uses its own buffer. Unfortunately, this is in effect for the entire server and can't selectively be turned off. We apologize for the inconvenience.
      

  15.   


    <?php
    ob_start();
    ob_end_flush();
    for($i = 1; $i <= 300; $i++ )echo ' ';$i = 0;
    while(1) {
    echo $i;
    sleep(1);
    $i++;
    }
    ?>
      

  16.   

    采用chunked方式传输首先IE必须先接收256个字符才能开始渲染页面,这点必须保证方式如下:
    1、必须有 Transfer-Encoding: chunked 头
    2、输出一行前先要输出该行的字节数
    3、输出完毕以单独一行“0”结尾HTTP/1.1 200 OK
    Date: Wed, 05 May 2010 05:13:26 GMT
    Content-Type: text/html
    Transfer-Encoding: chunked22
    <p>asdasdasdasdasdasdasdasdasd</p>
    22
    <p>asdasdasdasdasdasdasdasdasd</p>
    0
      

  17.   

    <?php
    header('Transfer-Encoding: chunked');
    $line = str_pad(' ', 256);
    echo dechex(strlen($line)), PHP_EOL;
    echo $line, PHP_EOL;
    $output = array(
    '<h1>《送别》</h1>',
    '</h2>作者:李叔同</h2>',
    '<p>长亭外,古道边,芳草碧连天</p>',
    '<p>晚风拂柳笛声残,夕阳山外山</p>',
    '<p>天之涯,地之角,知交半零落</p>',
    '<p>人生难得是欢聚,唯有别离多</p>',
    '<p>长亭外,古道边,芳草碧连天</p>',
    '<p>问君此去几时还,来时莫徘徊</p>',
    '<p>天之涯,地之角,知交半零落</p>',
    '<p>一壶浊洒尽余欢,今宵别梦寒 </p>'
    );
    foreach ($output as $line) {
    echo dechex(strlen($line)), PHP_EOL;
    echo $line, PHP_EOL;
    ob_flush();
    flush();
    sleep(2);
    }
    echo '0',PHP_EOL;
    ?>
      

  18.   

    试试这样
    for ($i=10; $i>0; $i--)
    {
    printf("%500d", $i);
    ob_flush();
    flush();
    sleep(1);
    }
      

  19.   

    更正 
    最后一行
    echo '0',PHP_EOL;应为
    echo '0',PHP_EOL,PHP_EOL;
      

  20.   

    另,如果是IIS+fast-cgi模式,需要设置c:\WINDOWS\system32\inetsrv\fcgiext.ini[PHP]
    ExePath=C:\Program Files\PHP\php-cgi.exe
    ResponseBufferLimit=0
      

  21.   

    应该是服务器供应商不松口的话是搞不定的了,谢谢大家.
    If the server has enough free CPU resources, it will automatically gzip-compress responses generated from php scripts.
      

  22.   


    按照描述,应该是空间提供商在PHP上加了层东西,类似fast-cgi之类的,这层东西会缓存PHP的输出,而又不受ob_flush的控制,没办法,认命吧。
      

  23.   

    貌似这位坛友遇到的情况和你的一样
    http://topic.csdn.net/u/20100316/10/6b5c7db1-9eeb-4ec0-bc47-e075940b1868.html