PHP Flush / ob_flush无效

时间:2010-12-19 02:04:47

标签: php buffer output-buffering

我尝试过多次尝试使用flush和ob_flush工作。我已经尝试设置ini以允许缓冲,我尝试使用我在网上找到的几个不同的功能来进行输出缓冲,而且根本没有任何功能正常工作。该脚本希望等到它完成后直到它回显输出。这是我到目前为止的脚本

 ob_start();

 //Login User
 echo 'Logging in to user<br>';
       ob_flush();
       flush();
      $ch = curl_init("http://www.mysite.com/login/");
      curl_setopt($ch, CURLOPT_HEADER, 0);
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, "username=$user&pass=$pass");
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
      curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies/$cookie");
      curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies/$cookie");
      $output = curl_exec($ch);
      curl_close($ch);
      ob_flush();
      flush();

       //Update Status
 echo 'Updating Status<br>';
       ob_flush();
       flush();
      $ch = curl_init("http://www.mysite.com/update/");
      curl_setopt($ch, CURLOPT_HEADER, 0);
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, "status=$status");
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
      curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies/$cookie");
      curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies/$cookie");
      $output = curl_exec($ch);
      curl_close($ch);
      ob_flush();
      flush();

我想让它回应它正在做的事情,然后运行该函数,然后回显其他东西,然后再做另一个函数。我希望在浏览器上实时刷新和回显所有缓冲区。

8 个答案:

答案 0 :(得分:41)

这里的想法是禁用输出缓冲,而不是启用它。顾名思义,输出缓冲会将输出保存到内存中并在脚本末尾显示,或者在明确要求时显示。

话虽如此,您不必为每个输出明确刷新。在显示任何输出之前使用以下内容,然后每次回显时都不必费心冲洗:

ob_implicit_flush(true);
ob_end_flush();

每个例子:

ob_implicit_flush(true);
ob_end_flush();

for ($i=0; $i<5; $i++) {
   echo $i.'<br>';
   sleep(1);
}

输出0到4,每秒显示一次。

答案 1 :(得分:4)

我只是想快速记下我在2016年观察到的不同建议的内容:

netcoder David 提供的上述代码在以下浏览器中适用于我:

它似乎不适用于Firefox,Safari或IE 10-11。

我还测试了替代代码:

<?php

    if (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();
?>

可在此处找到:http://php.net/manual/en/function.flush.php#54841

通过所有浏览器似乎有更好的当前支持:

  • 火狐
  • Safari浏览器
  • IE 10
  • IE 11

工作实施似乎每年都在变化,所以我想提供一份我目前发现自己工作的更新。

答案 2 :(得分:2)

这个问题似乎在Google搜索中出现了很多,所以我想更新它。 它是2014年9月.....

@Netcoder的答案确实有效,但Chrome有时仍会输出所有内容。

要解决此问题,只需在代码中添加ob_flush()and flush(),它就会在每秒后输出。

示例:

ob_implicit_flush(true);
ob_end_flush();

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

答案 3 :(得分:1)

请注意,您可能需要在网络服务器(apache或nginx)上禁用gzip压缩。

这是我的问题。

答案 4 :(得分:0)

我遇到了同样的问题,但是用户指出了我正确的方向,我使用了“for”循环来解决这个特定于浏览器的问题:

for($i = 0; $i < 5000; $i++)
{
    echo ' ';
}

有关详细信息,请与Outputting exec() ping result progressively相关联。

答案 5 :(得分:0)

现在可以使用(至少在php 5.5上)

ob_end_flush();
while(stuff){
  ..stuff...
  echo('yo');
  flush();
}

无需睡觉或其他任何事情

答案 6 :(得分:0)

typedef __nullable id(^AWSContinuationBlock)(AWSTask<ResultType> *task);

答案 7 :(得分:0)

2021 年更新

我遇到了同样的问题,我基本上使用了 Imanuel Habekotte 的解决方案

在我的 .htaccess 文件中;

SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI .*/my_file_name.php$ no-gzip dont-vary

然后在我的php代码文件(my_file_name.php)中;

header('Content-Type: text/octet-stream; charset=utf-8');
header('Cache-Control: no-cache'); // recommended to prevent caching of event data.


    ini_set('max_execution_time', 0);
    @ini_set('output_buffering','Off');
    @ini_set('zlib.output_compression',0);
    @ini_set('implicit_flush',1);
    @ob_end_clean();
    set_time_limit(0);
    ob_start();
    ob_implicit_flush(true);


/**
    Send a partial message
*/
function send_message($id, $message, $progress) 
{
    $d = array('message' => $message , 'progress' => $progress);
    
    echo json_encode($d) . PHP_EOL;
    
    echo str_pad('',8192)."\n";
    
    //PUSH THE data out by all FORCE POSSIBLE
    ob_flush();
    flush();
}