定义应该提到该函数还“关闭输出缓冲”,而不仅仅是清理它。
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
ob_get_clean — 获取活动输出缓冲区的内容并关闭它
此函数调用输出处理程序(使用PHP_OUTPUT_HANDLER_CLEAN
和 PHP_OUTPUT_HANDLER_FINAL
标志),丢弃其返回值,返回活动输出缓冲区的内容并关闭活动输出缓冲区。
如果没有使用PHP_OUTPUT_HANDLER_REMOVABLE
标志启动的活动输出缓冲区,则ob_get_clean() 将失败。
即使ob_get_clean() 使用没有PHP_OUTPUT_HANDLER_CLEANABLE
标志启动的活动输出缓冲区,它也会丢弃活动输出缓冲区的内容。
此函数没有参数。
如果函数失败,它会生成一个E_NOTICE
。
示例 #1 一个简单的 ob_get_clean() 示例
<?php
ob_start();
echo "Hello World";
$out = ob_get_clean();
$out = strtolower($out);
var_dump($out);
?>
上面的例子将输出
string(11) "hello world"
此外,不要忘记对于任何后续调用,您都需要再次使用 ob_start()
<?php
ob_start();
echo "1";
$content = ob_get_clean();
ob_start(); // 这对于下一个 ob_get_clean() 按预期工作是必要的。
echo "2";
$content .= ob_get_clean();
echo $content;
?>
输出:12
如果没有第二个 ob_start(),输出为 21…
请记住,根据您运行 PHP 的方式(CGI、CLI 等),输出可能默认被缓冲。您可以使用 ob_get_level() 来确定是否已经启动了输出缓冲区。在我使用的大多数 Web 服务器上,在我脚本开始运行之前,输出缓冲已经有一层了。
您应该只结束与您启动一样多的输出缓冲区。假设您的缓冲区始终是第一个缓冲区,或者以其他方式关闭预先存在的缓冲区,可能会导致问题。在 PHP 5.5 中,您可以使用 try-finally 块确保输出缓冲区正确结束。
像这样的东西几乎肯定会破坏东西
<?php
// 千万不要这样做!
while (ob_get_level() > 1)
{
ob_end_flush();
}
$content = ob_get_clean();
?>
问题在于数字“1”。在那里使用固定数字是在自找麻烦。相反,使用 ob_get_level() 获取代码启动时应用的输出缓冲区数量,如果必须使用未知数量的输出缓冲区,则返回该数量
<?php
ob_start();
$saved_ob_level = ob_get_level();
// 在这里执行操作:
run_something();
// 如果您真的必须关闭除一个之外的所有输出缓冲区,这将做到这一点:
while (ob_get_level() > $start_ob_level)
{
ob_end_flush();
}
// 现在,属于我们的最终输出缓冲区:
$content = ob_get_clean();
?>
<?php
ob_start();
echo "1";
$content = ob_get_clean();
echo "2";
$content .= ob_get_clean();
echo $content;
?>
此脚本在 CLI 模式下输出 21,在其他模式下(在我的 apache 和 nginx 下)输出 12
我尝试使用 `error_log()` 调试我的代码,发现 `ob_get_clean()` 会截断 `error_log()` 的缓冲区,使其输出中断,同时还会截断它本应截断的输出缓冲区。如果您正在使用 `error_log()`,请使用 `ob_get_contents()` 和 `ob_end_clean()` 来代替 `ob_get_clean()`。