所以ob_start()
应该捕获输出,直到调用另一个缓冲函数,如ob_get_clean()
,ob_get_contents()
,ob_get_flush()
。
但是当缓冲区读取器内部抛出异常时,它会通过停止并回显输出而不是继续捕获它来影响读取器。这就是我想要防止的。
让我们说这是我的剧本:
<?php
error_reporting(0);
try {
ob_start();
echo "I don't wanna output this what so ever, so want to cache it in a variable with using ob_ functions";
$unlink = unlink('some file that does not exist');
if(!$unlink) throw new Exception('Something really bad happen.', E_ERROR); //throwing this exception will effect the buffer
$output = ob_get_clean();
} catch(Exception $e) {
echo "<br />Some error occured: " . $e->getMessage();
//print_r($e);
}
?>
此脚本将输出:
I don't wanna output this what so ever, so want to cache it in a variable with using ob_ functions
Some error occurred: Something really bad happen.
当它想要打印时
Some error occurred: Something really bad happen.
我做错了什么,有解决方案吗?
答案 0 :(得分:7)
我的猜测是,即使在catch块内,输出缓冲仍然有效。但是,脚本以活动输出缓冲结束,因此PHP会自动显示输出缓冲区。
因此,您可以尝试在异常处理程序中调用ob_clean()
。
答案 1 :(得分:0)
您可以这样做:
<?php
error_reporting(0);
$currentBuffers = '';
try {
ob_start();
echo "I don't wanna output this what so ever, so want to cache it in a variable with using ob_ functions";
$unlink = unlink('some file that does not exist');
if(!$unlink) throw new Exception('Something really bad happen.', E_ERROR); //throwing this exception will effect the buffer
$output = ob_get_clean();
} catch(Exception $e) {
$currentBuffers = ob_get_clean();
ob_end_clean(); // Let's end and clear ob...
echo "<br />Some error occured: " . $e->getMessage();
//print_r($e);
}
// Do something to $currentBuffer
// Maybe start again?
ob_start();
echo "foo";
$currentBuffers .= ob_get_clean();
//echo $currentBuffers;
ob_end_clean();
?>