代码之家  ›  专栏  ›  技术社区  ›  medk

PHP输出缓冲引发警告

  •  0
  • medk  · 技术社区  · 6 年前

    当PHP脚本运行时,我必须输出结果:

    ob_implicit_flush(true);
    ob_start();
    for ($i=0; $i<5; $i++) {
        echo $i . ' - ';
        ob_end_flush();
        flush();
        sleep(1);
    }
    

    这是有效的,但会引发警告:

    注意:ob_end_flush():删除和刷新缓冲区失败。无缓冲区 删除或刷新…

    如何解决这个问题?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Jim Wright    6 年前

    在第一个循环中,您将结束缓冲区。如果您想这样做,应该在每个循环中启动一个新的缓冲区。

    ob_implicit_flush(true);
    for ($i=0; $i<5; $i++) {
        ob_start();
        echo $i . ' - ';
        ob_end_flush();
        flush();
        sleep(1);
    }
    

    这是一种使用缓冲的更整洁的方法。它的性能也更高,因为您只使用一个缓冲区。如果你不需要 flush 在每个循环中,您可以跳过 ob_flush 在循环中使用 ob_end_flush 而不是 ob_end_clean

    ob_implicit_flush(true);
    ob_start();
    for ($i=0; $i<5; $i++) {
        echo $i . ' - ';
        ob_flush();
        flush();
        sleep(1);
    }
    ob_end_clean();
    
        2
  •  1
  •   Blue    6 年前

    ob_end_flush() 将禁用缓冲,因此将来在循环中对此的调用将失败。简单使用 ob_flush() ,清除缓冲区但保持输出缓冲:

    ob_implicit_flush(true);
    ob_start();
    for ($i=0; $i<5; $i++) {
        echo $i . ' - ';
        ob_flush();
        sleep(1);
    }
    ob_end_flush();
    
        3
  •  0
  •   medk    6 年前

    好吧,我是这样修好的:

    ob_implicit_flush(true);
    ob_start();
    for ($i=0; $i<5; $i++) {
        echo $i . ' - ';
        flush();
        @ob_flush();
        @ob_end_clean();
        sleep(1);
    }
    

    现在可以工作了。