ob_get_clean

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

ob_get_clean获取活动输出缓冲区的内容并将其关闭

描述

ob_get_clean(): string|false

此函数调用输出处理程序(带有 PHP_OUTPUT_HANDLER_CLEANPHP_OUTPUT_HANDLER_FINAL 标志),丢弃其返回值,返回活动输出缓冲区的内容并关闭活动输出缓冲区。

ob_get_clean() 在没有使用 PHP_OUTPUT_HANDLER_REMOVABLE 标志启动的活动输出缓冲区的情况下将失败。

ob_get_clean() 将丢弃活动输出缓冲区的内容,即使它是没有使用 PHP_OUTPUT_HANDLER_CLEANABLE 标志启动的。

参数

此函数没有参数。

返回值

成功时返回活动输出缓冲区的内容,失败时返回 false

注意

ob_get_clean() 将返回 false,但如果不存在活动输出缓冲区,则不会生成 E_NOTICE

错误/异常

如果函数失败,它将生成 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() - 打开输出缓冲
  • ob_get_contents() - 返回输出缓冲区的内容
  • ob_clean() - 清除(擦除)活动输出缓冲区的内容
  • ob_end_clean() - 清除(擦除)活动输出缓冲区的内容并将其关闭
  • ob_get_flush() - 刷新(发送)活动输出处理程序的返回值,返回活动输出缓冲区的内容并将其关闭

添加备注

用户贡献备注 6 备注

geo dot artemenko at gmail dot com
10 年前
定义应提到该函数还“关闭输出缓冲”,而不仅仅是清除它。
steven at bielik dot com
13 年前
另外,不要忘记任何后续调用都需要再次 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...
paul+phpnet at earth2me dot com
10 年前
请记住,输出可能默认被缓冲,具体取决于您运行 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();
?>
sergei dot solomonov at gmail dot com
11 年前
<?php
ob_start
();
echo
"1";
$content = ob_get_clean();

echo
"2";
$content .= ob_get_clean();

echo
$content;
?>

此脚本在 CLI 模式下输出 21,在其他模式下输出 12(在我的 apache 和 nginx 下)
Peter Smartt
6 年前
我试图使用 error_log() 调试我的代码,我发现 ob_get_clean() 还会截断 error_log() 缓冲区,将其输出截断在中间,以及它应该截断的输出缓冲区。如果您使用 error_log(),请使用 ob_get_contents() 和 ob_end_clean() 而不是 ob_get_clean()。
ludvig dot ericson at gmail dot com
19 年前
请注意,下面的函数不会捕获错误,因此在那些 ob_* 调用之前添加 @
To Top