gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:49:18 25 4
gpt4 key购买 nike

如何停止调用 ob_start发出时回调 *_clean()电话。

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 启动的。旗帜根据 docs .

至于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(); }

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

  • 我会触发空缓冲区的警报,即使情况并非如此,因为它们会在另一个缓冲区中重建它

基本上我的问题是:

  • 我能阻止这样的事情吗?
  • 如果不行还有别的办法吗?

最佳答案

如果你有清除整个缓冲区的代码并且你无法控制它 - 你就没有办法让 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();

关于PHP: ob_start(),如何限制回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42786566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com