我正在寻找显示每行数字的东西,而不仅仅是页面加载后的所有数字。示例代码为:
for($a=0;$a<=10;$a++){
echo $a;
echo '<br>';
}
输出当然是:12页面加载后一直到10,但我想把它展示出来1然后2,不用浏览器加载所有内容。
我想暂停一下,看数字增加
你可以使用flush()强制php刷新它的输出。当然,如果PHP的输出缓冲是启用的,这只会将它刷新到输出缓冲区中。
一旦PHP刷新,它不能保证直接进入浏览器,PHP刷新到web服务器,根据web服务器自己的配置将其发送到浏览器。
然而,就PHP而言,以下将工作(至少在命令行上,或者在您的web服务器上,如果它配置正确):
demo.php
<?php
ob_end_flush(); // make sure output buffering is off
for($i=0;$i<10;$i++){
echo "{$i}'n";
flush();
sleep(1);
}
从命令行:
$ php demo.php
应该显示1…2…3.
之间有一秒的延迟。编辑:我又想到了一件事。即使web服务器确实"流"。如果您的输出位于其他标记的中间,则用户的浏览器可能在接收到整个响应之前不会呈现任何内容。也就是说,如果您在做一些基本的事情,我已经使用了上面的策略来输出长时间运行的实用程序脚本的状态。在这些情况下,我甚至可能没有在我的输出中包含标记,但它像您希望的那样工作(至少在我当时处理的服务器上)。
这种方法对于内部工具来说可能足够好,但是对于最终用户可能看到的任何事情,我都不会依赖于这种技术。
这是一个php脚本,将完成这一点。它不是一个真正的PHP脚本,而是一个用javascript完成相同功能的页面。这使您可以更好地控制客户端浏览器上发生的事情。有了输出缓冲和其他东西,就无法保证浏览器会按照您想要的方式呈现它,而只是用PHP控制输出。
<?php ?>
<html>
<head>
<title>
The Counting Page
</title>
<script type="text/javascript">
var oldbody;
function countTo(a,b)
{
if(oldbody == null)
{
oldbody = document.body.innerHTML;
document.body.innerHTML = '';
}
if(a <= b)
{
elem = document.createElement("div");
elem.innerHTML = a;
document.body.appendChild(elem);
a++;
setTimeout('countTo(' + a + ',' + b + ')',1000);
}
else
{
document.body.innerHTML = oldbody;
}
}
</script>
<head>
<body onload="countTo(1,10)">
Here is the body text.
</body>
</html>