PHP Conference Japan 2024

ob_get_clean

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

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

描述

ob_get_clean(): 字符串|false

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

如果没有使用PHP_OUTPUT_HANDLER_REMOVABLE标志启动的活动输出缓冲区,则ob_get_clean() 将失败。

即使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() - 刷新(发送)活动输出处理程序的返回值,返回活动输出缓冲区的内容并关闭它

添加注释

用户贡献的注释 5 条注释

77
geo dot artemenko at gmail dot com
10 年前
定义应该提到该函数还“关闭输出缓冲”,而不仅仅是清理它。
31
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…
9
paul+phpnet at earth2me dot com
11 年前
请记住,根据您运行 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();
?>
0
sergei dot solomonov at gmail dot com
12 年前
<?php
ob_start
();
echo
"1";
$content = ob_get_clean();

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

echo
$content;
?>

此脚本在 CLI 模式下输出 21,在其他模式下(在我的 apache 和 nginx 下)输出 12
-2
Peter Smartt
7 年前
我尝试使用 `error_log()` 调试我的代码,发现 `ob_get_clean()` 会截断 `error_log()` 的缓冲区,使其输出中断,同时还会截断它本应截断的输出缓冲区。如果您正在使用 `error_log()`,请使用 `ob_get_contents()` 和 `ob_end_clean()` 来代替 `ob_get_clean()`。
To Top