PHPerKaigi 2025

ob_end_clean

(PHP 4, PHP 5, PHP 7, PHP 8)

ob_end_cleanアクティブな出力用バッファをクリア(消去)し、出力のバッファリングをオフにする

説明

ob_end_clean(): bool

この関数は、 (PHP_OUTPUT_HANDLER_CLEANPHP_OUTPUT_HANDLER_FINAL フラグを指定して) 出力ハンドラをコールし、その戻り値を破棄するとともに、 アクティブな出力バッファの内容をクリア(消去)し、 かつそれをオフにします。

PHP_OUTPUT_HANDLER_REMOVABLE を指定して アクティブな出力バッファを開始しないと、 ob_clean() は失敗します。

ob_end_clean() は、PHP_OUTPUT_HANDLER_CLEANABLE を指定せずにアクティブな出力バッファを開始したとしても、 そのバッファの内容をクリアします。

パラメータ

この関数にはパラメータはありません。

戻り値

成功した場合に true を、失敗した場合に false を返します。

エラー / 例外

この関数は失敗すると E_NOTICE レベルのエラーを発行します。

以下は、アクティブな全ての出力バッファの内容を消去する簡単な方法の例です。

例1 ob_end_clean() の例

<?php
ob_start
();
echo
'Text that won\'t get displayed.';
ob_end_clean();
?>

参考

  • ob_start() - 出力のバッファリングを有効にする
  • ob_get_contents() - 出力用バッファの内容を返す
  • ob_clean() - アクティブな出力バッファの内容をクリア(消去)する
  • ob_get_clean() - アクティブな出力バッファの内容を取得し、そのバッファをオフにする
  • ob_end_flush() - アクティブな出力用バッファをフラッシュ(送信)し、アクティブな出力バッファをオフにする

add a note

User Contributed Notes 4 notes

up
8
Sam Yong - hellclanner at live dot com
13 years ago
Take note that if you change zlib output compression setting in between ob_start and ob_end_clean or ob_end_flush, you will get an error: ob_end_flush() failed to delete buffer zlib output compression

Example:

<?php

ob_start
();

$output = ob_get_contents();

ini_set('zlib.output_compression', '1');

ob_end_clean();

?>

ob_end_clean(); in this example will throw the error.
up
7
John Smith
20 years ago
Note that if you started called ob_start with a callback, that callback will still be called even if you discard the OB with ob_end_clean.

Because there is no way of removing the callback from the OB once you've set it, the only way to stop the callback function from having any effect is to do something like:

<?php
$ignore_callback
= false;
ob_start('my_callback');
...
if(
$need_to_abort) {
$ignore_callback = true;
ob_end_clean();
...
}

function
my_callback(&$buffer) {
if(
$GLOBALS['ignore_callback']) {
return
"";
}
...
}
?>
up
1
baklanoid at gmail dot com
4 years ago
If there is no confidence about output buffering (enabled or not),
you may try these guards:

<?php

while (ob_get_level() !== 0) {
ob_end_clean();
}

// or

while (ob_get_length() !== false) {
ob_end_clean();
}

?>
up
0
programmer at bardware dot de
21 years ago
You might want to prevent your script from executing if the client already has the latest version.
You can do it like so:

ob_start();

$mtime=filemtime($_SERVER["SCRIPT_FILENAME"])-date("Z");
$gmt_mtime = date('D, d M Y H:i:s', $mtime) . ' GMT';

$headers = getallheaders();

if(isset($headers["If-Modified-Since"])) {
if ($headers["If-Modified-Since"] == $gmt_mtime) {
header("HTTP/1.1 304 Not Modified");
ob_end_clean();
exit;
}
}

$size=ob_get_length();
header("Last-Modified: ".$gmt_mtime);
header("Content-Length: $size");
ob_end_flush();

Instead of checking the If-Modified-Since-Header against the date of the last modification of the script, you can of course query a database or take any other date that is somehow related to the modification of the result of your script.

You can for instance use this technique to generate images dynamically. If the user indicates he already has a version of the image by the If-Modified-Since-Header, there's no need to generate it and let the server finally discard it because the server only then interpretes the If-Modified-Since-Header.
This saves server load and shortens response-times.
To Top