ob_end_clean

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

ob_end_cleanLöscht den Inhalt des aktiven Ausgabepuffers und deaktiviert ihn

Beschreibung

ob_end_clean(): bool

Diese Funktion ruft den Ausgabe-Handler auf (mit den Flags PHP_OUTPUT_HANDLER_CLEAN und PHP_OUTPUT_HANDLER_FINAL), verwirft dessen Rückgabewert, verwirft den Inhalt des aktiven Ausgabepuffers und deaktiviert den aktiven Ausgabepuffer.

Wenn es keinen aktiven Ausgabepuffer gibt, der mit dem Flag PHP_OUTPUT_HANDLER_REMOVABLE gestartet wurde, schlägt ob_end_clean() fehl.

ob_end_clean() verwirft den Inhalt des aktiven Ausgabepuffers, auch wenn er ohne das Flag PHP_OUTPUT_HANDLER_CLEANABLE gestartet wurde.

Parameter-Liste

Diese Funktion besitzt keine Parameter.

Rückgabewerte

Gibt bei Erfolg true zurück. Bei einem Fehler wird false zurückgegeben.

Fehler/Exceptions

Wenn die Funktion fehlschlägt, erzeugt sie eine E_NOTICE-Meldung.

Beispiele

Das folgende Beispiel zeigt eine einfache Möglichkeit, den Inhalt des aktiven Ausgabepuffers loszuwerden:

Beispiel #1 ob_end_clean()-Beispiel

<?php
ob_start
();
echo
'Text der nicht ausgegeben wird.';
ob_end_clean();
?>

Siehe auch

  • ob_start() - Ausgabepufferung aktivieren
  • ob_get_contents() - Liefert den Inhalt des Ausgabepuffers
  • ob_clean() - Löscht den Inhalt des aktiven Ausgabepuffer
  • ob_get_clean() - Get the contents of the active output buffer and turn it off
  • ob_end_flush() - Leert (sendet) den Rückgabewert des aktiven Ausgabe-Handlers und deaktiviert den aktiven Ausgabepuffer

add a note add a note

User Contributed Notes 12 notes

up
8
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
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
2
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
-1
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.
up
-3
everling
18 years ago
Keep in mind that mrfritz379's example (#49800) is just an example. You can achieve that example's result in a more efficient manner without using output buffering functions:

echo "<p>Search running. Please be patient. . .";
$output = "<p>FileList: </p>\n";
if (is_dir($dir)) {
  $dh = opendir($dir);

  while (($fd = readdir($dh)) != false) {
    echo " .";
    $output .= $fd;
  }
}
echo "</br>Search Complete!</p>\n";
echo $output;





In addition to John Smith's comment (#42939), ob_gzhandler() may still set the HTTP header "Content-Encoding" to "gzip" or "deflate" even if you call ob_end_clean(). This will cause a problem in the following situation:

1. Call ob_gzhandler().
2. Echo "Some content";
3. Call ob_end_clean().
4. Echo "New content";

In the above case, the browser may receive the "Content-Encoding: gzip" HTTP header and attempts to decompress the uncompressed "New content". The browser will fail.

In the following situation, this behaviour will go unnoticed:

1. Call ob_gzhandler().
2. Echo "Some content";
3. Call ob_end_clean().
4. Call ob_gzhandler().
5. Echo "New content";

This is because the second ob_gzhandler() will mask the absence of the first ob_gzhandler().

A solution would be to write a wrapper, like John Smith did, for the ob_gzhandler().
up
-4
netom at elte dot hu
14 years ago
Notice that ob_end_clean() does discard headers.

If you would like to clear the output buffer, but not the headers (because you use firephp for example...), than this is the solution:

<?php
  
...

   
$headers = array();
    if ( !
headers_sent() ) {
     
$headers = apache_response_headers();
    }

   
ob_end_clean();
   
ob_start();

    if ( !empty(
$headers ) ) {
      foreach (
$headers as $name => $value ) {
       
header( "$name: $value" );
      }
    }

   ...
?>

I use it in a general exception handler in a web application, where I clear the buffer (but not the debug-info-containing headers), and send a 500 error page with readfile().

Good PHPing,

Tamas.
up
-2
daijoubuNOSP at Mvideotron dot com
20 years ago
About the previous comment:
You can also relay on ETag and simply use time()

<?php
$time
= time();
$mins = 1;
if (isset(
$_SERVER['HTTP_IF_NONE_MATCH']) and str_replace('"', '', $_SERVER['HTTP_IF_NONE_MATCH'])+($mins*60) > $time)
{
   
header('HTTP/1.1 304 Not Modified');
    exit();
}
else
{
   
header('ETag: "'.$time.'"');
}
echo
'Caching for ', $mins*60, 'secs<br/>', date('G:i:s');
?>
up
-3
geoff at spacevs dot com
17 years ago
If you call ob_end_clean in a function registered with "register_shutdown_function", it is too late, any buffers will have already been sent out to the client.
up
-4
Adam of Fusion Bay
18 years ago
You may want to be careful about calling ob_end_clean() from within your call-back function. I believe this can produce an endless-loop within PHP.
up
-3
mrfritz379
19 years ago
This may be posted elsewhere, but I haven't seen it.
To run a progress indicator while the program is running without outputting the output buffer, the following will work:

echo "<p>Search running. Please be patient. . .";
$output = "<p>FileList: </p>\n";
if (is_dir($dir)) {
   $dh = opendir($dir);

   while (($fd = readdir($dh)) != false) {
      echo " .";
      ob_start();
      echo $fd;
      $output .= ob_get_contents();
      ob_end_clean();
    }
}
echo "</br>Search Complete!</p>\n";
echo $output;

The program will continue to print the " ." without printing the file list. Then the "Search Complete" message will print followed by the buffered file list.
up
-5
tyler @
16 years ago
In reference to <geoff at spacevs dot com> where he states, "If you call ob_end_clean in a function registered with 'register_shutdown_function', it is too late, any buffers will have already been sent out to the client.", here is a workaround I came up with.

<?php

function ClearBuffer($Buffer) {
    return
"";
}

function
Shutdown() {
   
ob_start("ClearBuffer");
}

register_shutdown_function("Shutdown");

?>

This will wipe out all the contents of the output buffer as it comes in. Basically its the same as "STDOUT > /dev/null".
up
-6
Anonymous
7 years ago
To safely clear and close all non-lethal output buffers:

<?php

function ob_end_clean_all() {
   
$handlers = ob_list_handlers();
    while (
count($handlers) > 0 && $handlers[count($handlers) - 1] != 'ob_gzhandler' && $handlers[count($handlers) - 1] != 'zlib output compression') {
       
ob_end_clean();
       
$handlers = ob_list_handlers();
    }
}
To Top