PHP ob_start&flush - 在循环中打印并清除文本

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中可能吗?

谢谢。

+0

你能否详细说明正是你想达到什么目的?目前,对我来说,看起来你完全错用了'ob_ *'函数。但它也可能只是我,完全曲解你正在做的事情。我会说,你可以传递一个回调给['ob_start($ callback);'](https://secure.php.net/manual/en/function.ob-start.php#refsect1-function.ob -start参数)。不知道这是你在找什么。 –

+0

@DecentDabbler我只想在屏幕上始终只有for循环的一个(当前)键。所以,当循环是在34键,在屏幕上,我想只有“34”,当循环是56键,在屏幕上,我想只有“56”等。就这样。 – Majkson

+1

这是否适用于CLI(命令行界面)?你是否试图在命令行上设置一个计时器,并且每次计时器更新时都清除该行?因为如果是网络,你不能清理发送的内容。网络不这样工作。 –

该解决方案就像电子商务和购物篮,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(); 
    ?> 
+0

不,不是这样。我想,不难理解我想要什么。我只是想告知用户有关for循环的实际进度。类似百分比进度条,但我不想JS脚本,CSS样式等。我只想打印for循环的当前键/实例。这就是全部...... – Majkson

+0

所以我可以帮你。加入你的代码'sleep(2)'。之后,你可以检查 - 你的代码不工作,因为最终的结果是在循环结束。我希望实时打印结果。 – Majkson

由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>