测试代码如下:
<?php
ob_start();
for($i = 1; $i <= 100; $i++){
   $sourceName = 'filetoupload' . $i;
   $imageArray = array();
       $message = "Image $i has been uploaded to the server";
   echo $message;
   flush();
   ob_flush();
   usleep(500000);
}
ob_end_flush(); 
?>
测试结果如下:
在本地服务器上该脚本就可以边运行边输出,可是在内网服务器上运行就是100次循环运行完后才输出;想要的正确结果:
如同在本地服务器上运行结果一样,边运行边输出显示。请问为什么同样的脚本在内网服务器执行就是不同的结果,是不是与php.ini中的哪个配置项有关??? 与哪些配置项有关???望得到大家的帮助,先感谢了

解决方案 »

  1.   

    我觉得这个应该不会是跟配置文件有关
    问一下,你的内网服务器和本地服务器上的PHP版本是一样的吗?
    我感觉像这样的情况很多都是PHP版本问题。
      

  2.   

    我本机的php版本是5.2.0    服务器的PHP版本是 5.1.6
      

  3.   

    另外:flush支持的PHP版本为(PHP 3, PHP 4, PHP 5)
    ob_flush 支持的PHP版本为(PHP 4 >= 4.2.0, PHP 5)无论是我本机的PHP还是服务器的PHP版本都是支持上述函数的。
      

  4.   

    看一下这一页上的几个配置 
    http://ca.php.net/manual/en/outcontrol.configuration.php
      

  5.   

    这个问题我也试过,但我得到的答案是:php是服务器端的,多方面把php整个执行完才一次向客户发送。
     这个答案我一直半信半疑。。
    但也实现不了楼主所说的功能
      

  6.   

    ob_start();
    for($i = 1; $i <= 100; $i++){
    $sourceName = 'filetoupload' . $i;
    $imageArray = array();
    $message = "Image $i has been uploaded to the server";
    echo $message;
    ob_end_flush();
    flush();
    usleep(500000);
    }
      

  7.   


    这段代码和我的代码没啥区别,运行结果也是本机服务器是每隔500毫秒输出一次Image $i has been uploaded to the serverImage  其中$i从1一直到100; 内网服务器是100次循环运行完后才输出了所有的内容
      

  8.   


    比较了上述地址中的implicit_flush、output_buffering和output_handler三项配置是一致的。
    本机和内网服务器的PHP.ini中的设置均为:
    implicit_flush = Off
    output_buffering = Off
    ;output_handler =
      

  9.   

    我测试了一下 可以的 
    你的服务器是windows系统不 usleep不能工作在Windows 操作系统中
      

  10.   


    我的本机是windows系统,内网服务器是linux系统
      

  11.   

    把usleep(500000);
    换成sleep(1);试试
      

  12.   

    usleep()函数在PHP5.0.0之前是不可以工作在windows systems.无论是我本机服务器的PHP(5.2.0)还是内网服务器的PHP(5.1.6)都高于PHP5.0.0版本。
      

  13.   


    试了,在内网服务器(PHP版本:5.1.6 linux系统)下还是循环完后一次性输出结果。
      

  14.   

    你假如真的急的话!我想出一个办法!就是页面传值,不要用循环了!$id=empty($_GET['id'])?1:intval($_GET['id']);
    $sourceName = 'filetoupload' . $i;
    $imageArray = array();
    $message = "Image $i has been uploaded to the server";
    echo $message;
    if ($id>=100){
    exit();
    }
    $id++;
    $msg.="<META HTTP-EQUIV=Refresh CONTENT=0;URL=?id=".$id.">";
    echo $msg;
    exit();
      

  15.   

    为这问题 我开启了好久没用的linux 最终发现是缓存的问题 <?php
    ob_start();
    for($i = 1; $i <= 100; $i++){
        ob_end_flush();//关闭缓存
        $sourceName = 'filetoupload' . $i;
        $imageArray = array();
        $message = "Image $i has been uploaded to the server";
        echo $message;
        flush();
        ob_flush();
        usleep(500000);
    }
    ob_end_flush(); 
    ?>
      

  16.   

    我测试了如下脚本test.php代码:
    <?php
    echo "loop start:" . time() ."\n";
    for($i = 1; $i <= 100; $i++)
    {
       sleep(1);
    }
    echo "loop end:"  . time() ."\n" ;
    ?>
    测试环境:
    内网服务器(PHP:5.1.6  linux系统)、IE8测试结果:
    IE运行该test.php后并不是立马显示页面并输出内容,而是IE的tab标签页左侧的图标一致在转圈圈,IE的进度条一直在走着,直到它们都停止下来后页面才完全显示并输出loop start:1268720273 loop end:1268720373 内容。而测试以下代码:
    <?php
    echo "loop start:" . time() ."\n";
    echo "loop end:"  . time() ."\n" ;
    ?>
    如上环境,运行该test.php后,页面立马显示并输出内容。诚恳的请求大家的帮忙,再次感谢,帮自己顶下!
      

  17.   

    哎 终于找到了!看手册吧!
    如下代码:<?phpif (ob_get_level() == 0) ob_start();for ($i = 0; $i<10; $i++){        echo "<br> Line to show.";
            echo str_pad('',4096)."\n";            ob_flush();
            flush();
            sleep(2);
    }echo "Done.";ob_end_flush();?> 
      

  18.   


    循环外用了一对ob_start();ob_end_flush(); 你又在循环里的开头用了ob_end_flush();//关闭缓存
    ,你那边这样OK吗?在我这边用IE8访问内网服务器(PHP:5.1.6 linux系统)还是不OK,依然是循环完后一次性输出,而且还会输出一些警告通知信息:
    Image 1 has been uploaded to the server
    Notice: ob_flush() [ref.outcontrol]: failed to flush buffer. No buffer to flush. in /var/www/html/streaming_serverPush/test.php on line 8
    Notice: ob_end_flush() [ref.outcontrol]: failed to delete and flush buffer. No buffer to delete or flush. in /var/www/html/streaming_serverPush/test.php on line 4
      

  19.   

    IE下还真没试 火狐下OK= = 干活了 你再研究研究
      

  20.   


    这个代码我已经试过了,刚又试了一遍,我把手册中能试的代码也都试了。本机服务器(PHP:5.2.0 Windows系统)是OK的,边运行边输出。 内网服务器(PHP:5.1.6  linux系统)不OK的,运行后一次性输出。按说不应该是脚本的问题,感觉还是服务器之间有差别造成的。但就是不知道问题出在哪里。头大!!!真的很感谢大家帮忙,依然在找答案中...
      

  21.   

    这个缓冲和浏览器相关,和apache的某些模块也相关。
    keep try
    ===================================
    ob_end_clean();
    apache_setenv('no-gzip', 1);
    ini_set('zlib.output_compression', 0);
    ini_set('implicit_flush', 1);
    ob_start();//开始缓冲数据
    for($i = 1; $i <= 100; $i++){
    $sourceName = 'filetoupload' . $i;
    $imageArray = array();
    $message = "Image $i has been uploaded to the server<br/>";
    echo $message.str_repeat(" ",1024);//ie有默认的1k buffer
    ob_flush();
    flush();
    usleep(500000);
    }
      

  22.   

    我换用另外一台内网服务器(PHP版本:5.1.6  linux系统 与之前的一致)就脚本就OK了,实现了我所要的边运行边输出,看来问题还是出在服务器配置上,具体问题点我还得比较它们的配置文件。在这里真的非常感谢楼上帮忙的每一位朋友,谢谢你们在百忙中抽出时间来帮我分析问题,感谢了。希望大家都工作顺利,每天开心。
      

  23.   


    不知道你是不是比我大,但我还是想叫你一声:大哥。
    你的这段代码在我之前的那个内网服务器上确实是OK的。
    你的这个提醒让我知道了问题的所在:
    我之前的内网服务器上的apache配置文件httpd.conf中打开了压缩模块,并且对压缩的类型进行了设置。如下:
    #压缩模块
    LoadModule deflate_module modules/mod_deflate.so   # Controls who can get stuff from this server.
    #
        Order allow,deny
        Allow from all
    #压缩的类型有:text/html text/javascript text/css
        AddOutputFilterByType DEFLATE text/html text/javascript text/css
    </Directory>这样当我服务器向客户端输出内容时就会先缓冲起来,等完成后一次性输出。这就造成了我上述的问题。真的感谢,太感谢了。 
      

  24.   

    嗨,你要早点去http://php.net/manual/en/function.flush.php看看就好了,以后遇到问题记得多上在线php手册看看,那里有全世界phper们的开发经验。呵呵
      

  25.   

    特地注册来感谢这位大虾,搞了好几个小时了,果然是跟APACHE有关