定义应提到该函数还“关闭输出缓冲”,而不仅仅是清除它。
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
ob_get_clean — 获取活动输出缓冲区的内容并将其关闭
此函数调用输出处理程序(带有 PHP_OUTPUT_HANDLER_CLEAN
和 PHP_OUTPUT_HANDLER_FINAL
标志),丢弃其返回值,返回活动输出缓冲区的内容并关闭活动输出缓冲区。
ob_get_clean() 在没有使用 PHP_OUTPUT_HANDLER_REMOVABLE
标志启动的活动输出缓冲区的情况下将失败。
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,在其他模式下输出 12(在我的 apache 和 nginx 下)
我试图使用 error_log() 调试我的代码,我发现 ob_get_clean() 还会截断 error_log() 缓冲区,将其输出截断在中间,以及它应该截断的输出缓冲区。如果您使用 error_log(),请使用 ob_get_contents() 和 ob_end_clean() 而不是 ob_get_clean()。