我有这个简单的代码
echo "start<br>";
while($row = $stmt->fetch())
{
// code
echo "inside while<br>";
}
echo "done";
页面不会实时回显我的内部,一旦完成处理整个数据,它就会同时输出所有的回声。我希望看到里面的回声当它们发生时,一个接一个......
感谢
答案 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做到这一点。您的数据只有在准备好后才会发送到浏览器,这意味着您的脚本需要在发送任何内容之前完成。
如果您仍想获得实时数据,则必须使用JavaScript
和Ajax
,我们会修改一些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>