我有一个很长的数据挖掘脚本,在其中的一部分中,我将一些信息回显到页面(实际上是在 foreach 循环期间)。

然而,我注意到信息并没有像我希望的那样立即发送到浏览器,而是以“分段”的形式发送到浏览器。

在 echo 后是否可以使用某些功能立即将所有数据发送到浏览器?

谢谢。

有帮助吗?

解决方案

您可能希望flush()。然而,PHP可以是使用输出缓冲。有几个方式,这可以改变的事情,但简而言之,你可以flush(),然后ob_flush()

其他提示

您可以尝试使用冲洗()后,每个回波,但即使这样,也不能保证这取决于你正在运行Web服务器到客户端的写操作。

是,你的输出填充到1024个字节将导致大多数浏览器开始显示的内容。

但是,我们也从没有人@的回答学会质疑“如何冲洗后输出的每个`echo`打电话?”,当浏览器必须猜测的页面,这可以通过发送适当的Content-Type头能够防止字符编码的1024个字节的浏览器的缓冲作用仅发生(例如“内容类型:文本/ HTML;字符集= UTF-8”),或通过适当的HTML元标签指定内容的字符集。它在所有浏览器的工作也适合我。

因此,基本上,所有一个需要做的是:

header('Content-Type: text/html; charset=utf-8');
ob_implicit_flush(true);

随着微胖或潮红没有要求,这是非常有益化妆的代码!当然,标头有任何内容之前被发送,以及一个也有以确保没有输出缓冲回事。

问题肯定解决了我!请(+1)@没有人对另一个问题的答案,以及它是否适合你。如果,但是,人们仍然会遇到的问题,我建议你检查出的答案,对于其他具体情况,其他问题可能presumely防止隐性冲洗无法正常工作。

另请注意,某些浏览器在响应正文包含一定量的数据(例如 256 或 1024 字节)之前不会开始显示任何内容。在此之前,我曾见过一些应用程序在进行刷新之前,会在页面顶部附近填充数据并添加 1024 个字符长的注释。这有点麻烦,但很有必要。

这适用于 Internet Explorer 和 Safari IIRC。

所以,

  • 如果是第一次刷新,请确保到目前为止已输出至少 1024 字节(不包括 HTTP 标头)。
  • 调用flush()
  • 如果您可以确定存在输出缓冲,请发出 ob_flush()

我喜欢只用

while (ob_get_level()) ob_end_flush();

靠近我的脚本开头的某个地方,然后就

flush();

每当我想冲水时。这假设您根本不需要任何输出缓冲,即使它是在脚本之前设置的(例如在 PHP.ini 或 htaccess 配置中)。

您应该能够使用这样的强制输出为immeadiately发送。把它在要被发送的输出的代码的一部分。

flush();
ob_flush();

唷!我终于找到了答案,谷歌Chrome浏览器的缓存问题!由于boysmakesh在正确的方向推进。下面是我使用的功能:

function buffer_flush(){

    echo str_pad('', 512);
    echo '<!-- -->';

    if(ob_get_length()){

        @ob_flush();
        @flush();
        @ob_end_flush();

    }

    @ob_start();

}

这是我怎么称呼它:

show_view('global', 'header'); // Echos the <html><head>... tags and
                               // includes JS and CSS.

show_view('global', 'splash_screen'); // Shows a loading image telling
                                      // the user that everything's okay.

buffer_flush(); // Pretty obvious. At this point the loading view shows
                // up on every browser i've tested (chrome, firefox,
                // IE 7 & 8)

show_view('global', 'main'); // Has a loop that echos "Test $i<br>" 5
                             // times and calls buffer_flush() each time.

show_view('global', 'footer'); // End the html page and use JQuery to
                               // fade out the loading view.

要完全在谷歌浏览器来解决这一问题, 尝试这样:

$i = 0;
$padstr = str_pad("",512," ");
echo $padstr;

while ($i <= 4){
    $padstr = str_pad("",512," ");
    echo $padstr;
    echo "boysmakesh <BR> ";
     flush();
    sleep(2);
    $i = $i + 1;
}

的Ee发送每个回波之前要发送512个字节。不要忘记你之前冲洗把<BR>在内容结束。要不然也不会在Chrome中工作,但在IE浏览器的工作原理。

在数据我们填充是浏览器相关的。对于某些浏览器它足有256个字节,但一些需要1024个字节。铬是512。

ignore_user_abort(TRUE); // run script in background
set_time_limit(0); // run script forever
$interval=150000;
$i = 0;

if(
  strpos($_SERVER["HTTP_USER_AGENT"], "Gecko") or
  strpos($_SERVER["HTTP_USER_AGENT"], "WebKit")
){
  # important to change browser into quirks mode
  echo '<?xml version="1.0" encoding="iso-8859-1"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
}

function buffer_flush(){
    echo "\n\n<!-- Deal with browser-related buffering by sending some incompressible strings -->\n\n";
    for ( $i = 0; $i < 5; $i++ )
        echo "<!-- abcdefghijklmnopqrstuvwxyz1234567890aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz11223344556677889900abacbcbdcdcededfefegfgfhghgihihjijikjkjlklkmlmlnmnmononpopoqpqprqrqsrsrtstsubcbcdcdedefefgfabcadefbghicjkldmnoepqrfstugvwxhyz1i234j567k890laabmbccnddeoeffpgghqhiirjjksklltmmnunoovppqwqrrxsstytuuzvvw0wxx1yyz2z113223434455666777889890091abc2def3ghi4jkl5mno6pqr7stu8vwx9yz11aab2bcc3dd4ee5ff6gg7hh8ii9j0jk1kl2lmm3nnoo4p5pq6qrr7ss8tt9uuvv0wwx1x2yyzz13aba4cbcb5dcdc6dedfef8egf9gfh0ghg1ihi2hji3jik4jkj5lkl6kml7mln8mnm9ono -->\n\n";

    while ( ob_get_level() )
        ob_end_flush();

    if(ob_get_length()){
        @ob_flush();
        @flush();
        @ob_end_flush();
    }
    @ob_start();
}

ob_start(); 

do{

  if($i<10){
    buffer_flush(); 
    echo ". ";    
    buffer_flush(); 
    usleep($interval);

  } else {
    echo sprintf("<pre>%s</pre>", print_r($_SERVER,true));
    break;
  }

  $i++;

}while(true);

在IIS 7运行PHP 5.5,IE 11(赢服务器)我发现这个工作作为该文件的开头几行。注意把while语句的标题引起了头已经写入错误之前。

header('Content-Type: text/html; charset=utf-8');
while (ob_get_level()) ob_end_flush();
ob_implicit_flush(true);

此外引用使用ob_flush()在脚本导致缓冲区中不存在错误。

这工作得很好,当我处理一个文件,将SQL语句发送到浏览器,但是当我迷上了数据库(MS服务器2008)我没有输入返回,直到脚本已经完成。

这个组合终于为我工作的基础上,thomasrutter的答案

while (ob_get_level()) ob_end_flush();
ob_implicit_flush(true);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top