不是不行,而是你没有注意到:个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。 

解决方案 »

  1.   

    刷新PHP程序的缓冲,而不论PHP执行在何种情况下(CGI ,web服务器等等)。该函数将当前为止程序的所有输出发送到用户的浏览器。 flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此,必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。 个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。 有些Apache的模块,比如mod_gzip,可能自己进行输出缓存,这将导致flush()函数产生的结果不会立即被发送到客户端浏览器。 甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。 一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。 
      

  2.   

    <?
    for($i=0;$i<5;$i++){
    echo $i ."<br>";
    ob_flush();
    flush();
    sleep(1);
    }
    ?>
      

  3.   

    以上方法均不行flush() 函数不会对服务器或客户端浏览器的缓存模式产生影响。因此,必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。 
    =====================================
    加上ob_flush后不行个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输出,直到程序结束为止。 
    ========================================
    我在本地安装vBulletin时,他在创建数据库时有这种效果的,他会不断地显示"某某某数据库已被创建",因此不存在web服务器和浏览器的问题。一些版本的 Microsoft Internet Explorer 只有当接受到的256个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。 
    =========================================================
    我把每多输出一些字符还是不行。
    for($i=0;$i<5;$i++){
    echo $i ."个别web服务器程序,特别是Win32下的web服务器程序,在发送结果到浏览器之前,仍然会缓存脚本的输甚至浏览器也会在显示之前,缓存接收到的内容。例如 Netscape 浏览器会在接受到换行或 html 标记的开头之前缓存内容,并且在接受到 </table> 标记之前,不会显示出整个表格。<br>";
    ob_flush();
    flush();
    sleep(1);
    }
      

  4.   

    vBulletin安装时的这种效果是在每次输出一段字符后,调用一个vbflush函数,我把这个函数铐到我的测试文件里测试,但确不管用。
    这个函数是样的
    function vbflush()
    {
    static $output_handler = null;
    if ($output_handler === null)
    {
    $output_handler = @ini_get('output_handler');
    } if ($output_handler == 'ob_gzhandler')
    {
    // forcing a flush with this is very bad
    return;
    } flush();
    if (PHP_VERSION  >= '4.2.0' AND function_exists('ob_flush') AND function_exists('ob_get_length') AND ob_get_length() !== false)
    {
    @ob_flush();
    }
    else if (function_exists('ob_end_flush') AND function_exists('ob_start') AND function_exists('ob_get_length') AND ob_get_length() !== FALSE)
    {
    @ob_end_flush();
    @ob_start();
    }
    }
      

  5.   

    vBulletin会不会是用AJAX实现的,本人只是猜测......
      

  6.   

    简单的写一遍,以下的你全做到了吗?1.同时用flush和ob_flush
    2.不要使用win32下的服务比如IIS
    3.确保apahce加载mod_gzip这类会缓存结果的模块
    4.不要将输出内容放在表格这样的标签内
    5.事先输出256个以上的字节才开始输出正式数据
      

  7.   

    简单的写一遍,以下的你全做到了吗?===================================
    不错,确定都做到了,我分别用公司的linux-apache和本地的win-apache下都试了,没有加mod_gzip,事先输出一些字符。
    真是奇怪呃
      

  8.   

    解决了,填充字符输出的不够多。
    ===========================
    <?
    for($i=0;$i<5;$i++){
    echo $i ."<br/>";
    echo str_pad('',4096)."<br />\n";
    flush ();
    sleep(1);
    }
    ?>
    ===========================
      

  9.   

    ---------- David程序调试 ----------
    0<br/>1<br/>2<br/>3<br/>4<br/>
    Output completed (5 sec consumed) - Normal Termination