在发出ob_start
来电时,如何停止拨打*_clean()
来电。
ob_start(function($buffer, $phase){
// code here
}, 0, PHP_OUTPUT_HANDLER_FLUSHABLE | PHP_OUTPUT_HANDLER_REMOVABLE);
不会阻止ob_end_clean
,ob_get_clean
或ob_clean
来电。
我希望通知缓冲区没有使用正确的PHP_OUTPUT_HANDLER_CLEANABLE
标志启动
根据{{3}}。
对于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(); }
触发我的回调,即使它不应该,因为代码不是它的所有者/没有设置可清除标志
基本上我的问题是:
答案 0 :(得分: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();