【问题标题】:Can I have the equivalent of ob_implicit_flush() and ob_end_flush() in php.ini?我可以在 php.ini 中有等效的 ob_implicit_flush() 和 ob_end_flush() 吗?
【发布时间】:2019-05-22 14:53:32
【问题描述】:

在调试期间单步执行 PHP 代码时(例如在 Netbeans 中),我希望立即在浏览器中看到 PHP 输出。这可以通过在 PHP 代码的开头包含以下内容来实现(至少在使用 PHP7.2 和 Firefox 时):

  ob_implicit_flush ();
  while (@ob_end_flush());

这样可以确保像

echo "foo\n";

立即导致“foo”显示在 Web 浏览器中,而不是在输出缓冲区到期进行刷新或 PHP 代码在完成或错误时退出时。

但是有没有办法通过编辑 php.ini 来实现这一点,这样我就不必将它包含在要调试的每一位 PHP 代码中? (我知道这会导致性能下降,但这仅用于开发和调试目的。)

【问题讨论】:

    标签: php flush


    【解决方案1】:

    刷新输出缓冲区是开发人员必须执行的隐式操作,因此不能在 php.ini 中打开或关闭。

    然而,PHP 确实有一个名为ticks 的功能,它允许开发人员注册一个回调函数,以便在每执行 X 行代码时调用一次。

    请参阅register_tick_function,您可以在其中定义自己的回调函数来执行刷新,并让它在程序中的每个语句之间运行。这显然会影响性能,并且可能有更好的方法来实现您想要做的事情。

    例子:

    declare(ticks=1);
    function autoFlushBuffer() {
      ob_implicit_flush ();
      while (@ob_end_flush());
    }
    register_tick_function("autoFlushBuffer", true);
    
    // The following lines will appear in your web browser one by one:
    echo "one";
    sleep(1);
    echo "two";
    sleep(1);
    echo "three";
    sleep(1);
    

    【讨论】:

    • 我意识到通过 [while (@ob_end_flush());] 刷新输出缓冲区是程序行为的一部分,而不是 PHP 配置。然而,ob_implicit_flush() 改变了 PHP 的默认行为(打开和关闭隐式刷新,即在每次输出调用后刷新缓冲区),这让我希望这可以通过 php.ini 来实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2021-02-02
    • 1970-01-01
    相关资源
    最近更新 更多