在一个while循环中回显不实时显示数据。显示仅在结束时发生

时间:2015-01-23 19:02:00

标签: php

我有这个简单的代码

 echo "start<br>";

 while($row = $stmt->fetch())
 { 
    // code
    echo "inside while<br>";
 }

  echo "done";

页面不会实时回显我的内部,一旦完成处理整个数据,它就会同时输出所有的回声。我希望看到里面的回声当它们发生时,一个接一个......

感谢

4 个答案:

答案 0 :(得分:5)

这就是PHP默认工作的方式。它会缓冲输出,并且在页面完成之前不会将其发送到您的浏览器。

有一种解决方法。您关闭所有输出缓冲,并在每次flush时告诉PHP echo数据。

我在这里找到了一个解决方案:http://manzzup.blogspot.com/2013/11/real-time-updating-of-php-output-using.html

执行此操作的代码是:

// Turn off output buffering
ini_set('output_buffering', 'off');
// Turn off PHP output compression
ini_set('zlib.output_compression', false);

//Flush (send) the output buffer and turn off output buffering
while(@ob_end_flush());

// Implicitly flush the buffer(s)
ini_set('implicit_flush', true);
ob_implicit_flush(true);

// Needed to force browsers to actually display data
echo str_pad("",1024," ");
echo "<br />";

将其添加到页面顶部。然后,您的数据将显示在页面上循环正在运行。

答案 1 :(得分:1)

你不能轻易地用PHP做到这一点。您的数据只有在准备好后才会发送到浏览器,这意味着您的脚本需要在发送任何内容之前完成。

如果您仍想获得实时数据,则必须使用JavaScriptAjax,我们会修改一些php设置,如其他答案所示。

答案 2 :(得分:0)

它可能是输出缓冲。你可以尝试这样的事情:

if (ob_get_level() == 0) ob_start(); 
echo "start<br>";
ob_flush(); 
flush();  

 while($row = $stmt->fetch()){ 
    echo "inside while<br>";
    ob_flush(); 
    flush();  
    usleep(50000);//flush wait for IE
 }

echo "done";
ob_flush(); 
flush();  

答案 3 :(得分:0)

正如其他人所说,PHP显示加载后的内容。如果内容太多,那么就会如你所说的那样发生,但事实并非如此。

也就是说,如果您喜欢这种效果,可以编写一些javascript来模拟它:

var rows = $(".rows").find("p");

var delay = 0;
rows.each(function() {
    var row = $(this);
    setTimeout(function() {
        row.slideDown();
        $("body")[0].scrollTop = $("body")[0].scrollHeight;
    }, delay);
    delay += 500;
});
#content {
    width: 80%;
    margin: 0 auto;
    padding: 20px;
    background: #f3f3f3;
}
.rows p {
    display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="content">
    <h1>Database rows</h1>
    <div class="rows">
        <p>Database row #1</p>
        <p>Database row #2</p>
        <p>Database row #3</p>
        <p>Database row #4</p>
        <p>Database row #5</p>
        <p>Database row #6</p>
        <p>Database row #7</p>
        <p>Database row #8</p>
        <p>Database row #9</p>
        <p>Database row #10</p>
        <p>Database row #11</p>
        <p>Database row #12</p>
        <p>Database row #13</p>
        <p>Database row #14</p>
        <p>Database row #15</p>
        <p>Database row #16</p>
        <p>Database row #17</p>
        <p>Database row #18</p>
        <p>Database row #19</p>
        <p>Database row #20</p>
        <p>Database row #21</p>
        <p>Database row #22</p>
        <p>Database row #23</p>
        <p>Database row #24</p>
        <p>Database row #25</p>
    </div>
</div>