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

5

如何在调用*_clean()时停止对ob_start回调函数的调用。

ob_start(function($buffer, $phase){
    // code here
}, 0, PHP_OUTPUT_HANDLER_FLUSHABLE | PHP_OUTPUT_HANDLER_REMOVABLE);

不会阻止运行 ob_end_clean, ob_get_cleanob_clean 函数。 根据文档 ,我期望得到一个通知,指出缓冲区没有用适当的 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

我试图使用已知的常数来限制清洗方法不触发我的回调并使其逻辑短路。但我无法获取任何干净方法中$phase的内容(不能在回调中调用printf、echo、ob_start)。

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

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

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

  • 即使代码不属于所有者/未设置可清理标志,它也会触发我的回调

  • 我即使缓冲区不为空也触发警报,因为它们在另一个缓冲区中重构

基本上我的问题是:

  • 我能停止这种事情吗?
  • 如果不能,是否有其他方法?
1个回答

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;
    }
}

你可以按以下方式使用它。
// ... some code
MyBuffer::add('Hello user, glad you joined us!');
// ... some more code
MyBuffer::add('Your socore is ' . $score . '. Congratz!');
// ...
echo MyBuffer::get_clean();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接