PHP:ob_start(),如何限制回调

Kro*_*otz 5 php ob-start

如何ob_start在发出*_clean()呼叫时停止呼叫回叫.

ob_start(function($buffer, $phase){
    // code here
}, 0, PHP_OUTPUT_HANDLER_FLUSHABLE | PHP_OUTPUT_HANDLER_REMOVABLE);
Run Code Online (Sandbox Code Playgroud)

不阻止ob_end_clean,ob_get_clean或者ob_clean被RAN电话.我希望通知文档,缓冲区没有使用正确的PHP_OUTPUT_HANDLER_CLEANABLE标志启动.

至于PHP_OUTPUT_HANDLER_*常数,我还没有找到一个合适的手册页,其中$phase解释了参数,并详细说明了与这些常量有关的位组.甚至我必须从CONSTANTS全局变量获取它们的实际名称/值.

PHP_OUTPUT_HANDLER_START
PHP_OUTPUT_HANDLER_WRITE
PHP_OUTPUT_HANDLER_FLUSH
PHP_OUTPUT_HANDLER_CLEAN
PHP_OUTPUT_HANDLER_FINAL
PHP_OUTPUT_HANDLER_CONT
PHP_OUTPUT_HANDLER_END
PHP_OUTPUT_HANDLER_CLEANABLE
PHP_OUTPUT_HANDLER_FLUSHABLE
PHP_OUTPUT_HANDLER_REMOVABLE
PHP_OUTPUT_HANDLER_STDFLAGS
PHP_OUTPUT_HANDLER_STARTED
PHP_OUTPUT_HANDLER_DISABLED
Run Code Online (Sandbox Code Playgroud)

知道了这些常量,我试图限制,以便没有干净的方法触发我的回调并使其逻辑短路.但我无法获取$phase任何干净方法的内容(不能从回调中调用printf,echo,ob_start).

也许我错了,我的情况是:

  • 我在开始时启动缓冲区以便稍后处理所有输出
  • 我无法控制的许多代码运行:

    for ($i = 0; $i < ob_get_level(); $i++) { $final .= ob_get_clean(); }

  • 触发我的回调,即使它不应该因为代码不是它的所有者/没有设置可清除标志

  • 我触发空缓冲区的警报,即使不是这种情况,因为它们在另一个缓冲区中重建它

基本上我的问题是:

  • 我能阻止这样的事吗?
  • 如果没有另外的方法?

Bog*_*ans 0

如果您有清除整个缓冲区的代码并且您无法控制它 - 您就无法让 ob_* 命令正常工作。不过,您可以实现自己的缓冲区构造并手动添加输出。

类可能看起来像这样

<?php

class MyBuffer
{
    static $buffer = '';

    public static function add(string $output)
    {
        self::$buffer .= $output;
    }

    public static function get()
    {
        return self::$buffer;
    }

    public static function get_clean()
    {
        $buffer = self::$buffer;
        self::$buffer = '';
        return $buffer;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式使用它

// ... some code
MyBuffer::add('Hello user, glad you joined us!');
// ... some more code
MyBuffer::add('Your socore is ' . $score . '. Congratz!');
// ...
echo MyBuffer::get_clean();
Run Code Online (Sandbox Code Playgroud)