CakeFest 2024: The Official CakePHP Conference

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 flag),丢弃其返回值,返回活动输出缓冲区的内容并关闭活动输出缓冲区。

如果没有以 PHP_OUTPUT_HANDLER_REMOVABLE flag 启动的活动输出缓冲区,ob_get_clean() 将失败。

ob_get_clean() 将丢弃活动输出缓冲区的内容,即使是在没有 PHP_OUTPUT_HANDLER_CLEANABLE flag 的情况下启动的。

返回值

成功时返回活动输出缓冲区的内容,失败时返回 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() - 冲刷(发送)活动输出处理程序的返回值,返回活动输出缓冲区的内容并将其关闭

add a note

User Contributed Notes 6 notes

up
75
geo dot artemenko at gmail dot com
10 years ago
The definition should mention that the function also "turns off output buffering", not just cleans it.
up
31
steven at bielik dot com
13 years ago
Also, don't forget that you will need to ob_start() again for any successive calls:

<?php
ob_start
();
echo
"1";
$content = ob_get_clean();

ob_start(); // This is NECESSARY for the next ob_get_clean() to work as intended.
echo "2";
$content .= ob_get_clean();

echo
$content;
?>

Output: 12

Without the second ob_start(), the output is 21 ...
up
7
paul+phpnet at earth2me dot com
10 years ago
Keep in mind that output may be buffered by default, depending on how you are running PHP (CGI, CLI, etc.). You can use ob_get_level() to determine if an output buffer has already been started. On most web servers I've used, output buffering is already one level deep before my scripts start running.

You should only end as many output buffers as you start. Assuming that your buffer is always the first buffer, or otherwise closing pre-existing buffers, could lead to problems. In PHP 5.5, you can ensure that output buffers are ended properly using a try-finally block.

Something like this is almost guaranteed to break stuff:

<?php
// Don't ever do this!
while (ob_get_level() > 1)
{
ob_end_flush();
}

$content = ob_get_clean();
?>

The problem is that number, "1". Using a fixed number there is asking for trouble. Instead, use ob_get_level() to get the number of output buffers applied when your code starts, and return to that number, if you really must use an unknown number of output buffers:

<?php
ob_start
();
$saved_ob_level = ob_get_level();

// Do stuff here:
run_something();

// If you really must close all of your output buffers except one, this'll do it:
while (ob_get_level() > $start_ob_level)
{
ob_end_flush();
}

// And now, the final output buffer that belongs to us:
$content = ob_get_clean();
?>
up
0
sergei dot solomonov at gmail dot com
11 years ago
<?php
ob_start
();
echo
"1";
$content = ob_get_clean();

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

echo
$content;
?>

This script outputs 21 in CLI mode and 12 otherwise (under my apache and nginx)
up
-3
Peter Smartt
6 years ago
I was trying to debug my code using error_log() and I discovered that ob_get_clean() also truncates the error_log() buffer right in the middle of its output, and well as the output buffer which it is supposed to truncate. If you are using error_log(), use ob_get_contents() and ob_end_clean() instead of ob_get_clean().
up
-45
ludvig dot ericson at gmail dot com
18 years ago
Notice that the function beneath does not catch errors, so throw in an @ before those ob_* calls
To Top