【问题标题】:PHP ob_start & flush - print and clean text in loopPHP ob_start & flush - 在循环中打印和清理文本
【发布时间】:2017-04-21 19:31:55
【问题描述】:

是否可以使用 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可以吗?

谢谢。

【问题讨论】:

  • 您能详细说明您想要达到的目标吗?目前,对我来说,您似乎完全滥用了ob_* 函数。但也可能只是我,完全误解了你想要做的事情。不过我会说,您可以将回调传递给ob_start( $callback );。不确定这是否是您要找的。​​span>
  • @DecentDabbler 我只想在屏幕上始终只有一个(当前)for循环键。因此,当循环在 34 键上时,屏幕上我希望只有“34”,当循环在 56 键上时,屏幕上我希望只有“56”等。仅此而已。
  • 这是用于 CLI(命令行界面)吗?您是否尝试在命令行上设置一个计时器并在每次计时器更新时清除该行?因为如果它是用于网络的,您无法清理已发送的内容。网络不是这样工作的。
  • @DecentDabbler 是的。
  • 好的,但是您代码中的&lt;br&gt; 似乎建议您要输出 HTML。您确定它是为command line 准备的,而不是通过网络服务器(如 Apache)提供服务吗?

标签: php flush ob-start


【解决方案1】:

按照 OP 的 cmets,我将假设 OP 想要在命令行上设置一个计时器,并假设 &lt;br&gt; 旨在传达换行符。

命令行上的计时器,每滴答一次都会清除该行,可以解释如下:

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 浏览器中查看结果,那么您就不走运了。您无法按照您想要的方式清除发送到 Web 浏览器的输出,因为 Web 是 client &lt;-&gt; server 架构。你必须understand this architecture and use something like AJAX, websockets, or perhaps long polling

【讨论】:

  • 您是否有一个不适用于 cli 的解决方案,因为 \r 不起作用?
【解决方案2】:

如果您需要在控制台中执行此操作,@Decent Dabbler 给出了最佳建议。 如果需要在浏览器中进行,则不需要 PHP。您可以使用 javascript 进行制作。

function setCounter(value)
{
  document.getElementById('counter').innerText = value;
}

var counter = 0;
setInterval(
  function() {
    setCounter(++counter);
  },
  1000
);
&lt;div id="counter"&gt;&lt;/div&gt;

【讨论】:

    【解决方案3】:

    解决方案就像电子商务、购物篮和 cookie 一样,在客户端和服务器之间进行 99 次请求和应答。在每个 $i 必须退出后,再次请求 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();
        ?>
    

    【讨论】:

    • 不,不是那样。我想,理解我想要什么并不难。我只想告知用户 for 循环的实际进度。百分比进度条之类的东西,但我不想要 JS 脚本、CSS 样式等。我只想打印 for 循环的当前键/实例。就是这样……
    • 所以我可以帮助你。添加到您的代码sleep(2)。之后您可以检查 - 您的代码不起作用,因为最终结果在循环结束时。我想要实时打印结果。
    猜你喜欢
    • 1970-01-01
    • 2016-03-24
    • 2016-12-21
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多