首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP Flush/ob_flush不起作用

PHP Flush/ob_flush不起作用
EN

Stack Overflow用户
提问于 2010-12-19 10:04:47
回答 8查看 35.6K关注 0票数 11

我已经尝试了几次让我的flush和ob_flush正常工作。我已经尝试将ini设置为允许缓冲,我已经尝试使用我在网上找到的几个不同的函数来进行输出缓冲,但它们都不起作用。脚本想要等到它完全完成,直到它回显输出。以下是我到目前为止所使用的脚本

代码语言:javascript
复制
 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();

我希望它回显它正在做的事情,然后运行函数,然后回显其他内容,然后执行另一个函数。我希望所有的缓冲区都被刷新,并在浏览器上实时回显。

EN

回答 8

Stack Overflow用户

发布于 2010-12-19 12:28:03

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

也就是说,您不必显式地为每个输出刷新。在显示任何输出之前使用以下命令,这样您就不必在每次回显某些内容时都刷新:

代码语言:javascript
复制
ob_implicit_flush(true);
ob_end_flush();

每个示例:

代码语言:javascript
复制
ob_implicit_flush(true);
ob_end_flush();

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

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

票数 44
EN

Stack Overflow用户

发布于 2016-01-25 23:44:33

我只想写下我在2016年观察到的不同方法的建议:

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

  • Chrome
  • Opera

它在Firefox、Safari或IE 10-11中似乎不起作用。

我还测试了替代代码:

代码语言:javascript
复制
<?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

它目前似乎在所有浏览器中都有更好的支持:

  • Chrome
  • Firefox
  • Opera
  • Safari
  • IE 10
  • IE 11

工作的实现似乎每年都在变化,所以我想更新一下我发现自己目前正在工作的情况。

票数 8
EN

Stack Overflow用户

发布于 2016-09-25 05:25:37

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

这是我的问题。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4481235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档