PHP ob_start&flush - 在循环中打印并清除文本
问题描述:
是否可以使用ob_start()& flush()来在屏幕上打印文本并最终清理此文本?PHP ob_start&flush - 在循环中打印并清除文本
现在我有类似的东西:
<?php
ob_start();
ob_end_flush(); flush(); ob_flush();
for($i = 0; $i<100; $i++)
{
echo $i.'<br>';
flush();
ob_flush();
}
ob_end_flush();
?>
,当我执行这个代码,我得到类似的东西:
0
1
2
3
4
5
6
7
8
...
但我想呼应当前键和清除它们:
0
... (clean "0")
1
... (clean "1")
2
... (clean "2")
最后我想在屏幕上只有一个数字。在PHP中可能吗?
谢谢。
答
该解决方案就像电子商务和购物篮,cookie和99次去客户端和服务器之间的请求和答复。在每一美元我必须退出后,再次请求cookie和$ i + 1。所有这些到循环结束。
也许这就是你想要的。在屏幕上只有一个号码,最后一个,99
<?php
ob_start();
for($i = 0; $i<100; $i++)
{
echo $i.'<br>';
//flush();
//ob_flush();
ob_clean();
echo $i.'<br>';
}
ob_end_flush();
?>
答
由OP的评论去,我要承担OP要在命令行上一个计时器,并推测<br>
是为了传达一个换行符。
命令行,它清除每一刻度线上的计时器,可以如下解释:
for($i = 0; $i < 100; $i++) {
/*
the \r moves the cursor back to the start of the line
the additional spaces are there to make sure
any additional digits are removed as well
adjust the amount of spaces to the max amount of digits
(which is actually only useful if the timer was counting down, in stead of counting up)
*/
echo "$i \r";
// wait a second
sleep(1);
}
ob_*
功能在这里没有用的;在发送输出之前,它们仅仅是PHP的内部缓冲区。您无法清除已发送的内容。
如果你想完全清除屏幕,我建议看看this question和相关问题中的建议。
但是,如果您通过网络服务器输出并在Web浏览器中查看结果,那么您运气不好。您无法以您打算的方式清除发送给Web浏览器的输出,因为网络是client <-> server
体系结构。你必须understand this architecture and use something like AJAX, websockets, or perhaps long polling。
答
如果您需要在控制台中进行操作,@Decent Dabbler会显示最佳建议。 如果您需要在浏览器中执行此操作,则不需要PHP。你可以使用JavaScript。
function setCounter(value)
{
document.getElementById('counter').innerText = value;
}
var counter = 0;
setInterval(
function() {
setCounter(++counter);
},
1000
);
<div id="counter"></div>
你能否详细说明正是你想达到什么目的?目前,对我来说,看起来你完全错用了'ob_ *'函数。但它也可能只是我,完全曲解你正在做的事情。我会说,你可以传递一个回调给['ob_start($ callback);'](https://secure.php.net/manual/en/function.ob-start.php#refsect1-function.ob -start参数)。不知道这是你在找什么。 –
@DecentDabbler我只想在屏幕上始终只有for循环的一个(当前)键。所以,当循环是在34键,在屏幕上,我想只有“34”,当循环是56键,在屏幕上,我想只有“56”等。就这样。 – Majkson
这是否适用于CLI(命令行界面)?你是否试图在命令行上设置一个计时器,并且每次计时器更新时都清除该行?因为如果是网络,你不能清理发送的内容。网络不这样工作。 –