The definition should mention that the function also "turns off output buffering", not just cleans it.
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
ob_get_clean — Obtiens le contenu du tampon de sortie actif et désactive-le
Cette fonction appelle le gestionnaire de sortie
(avec les drapeaux PHP_OUTPUT_HANDLER_CLEAN
et
PHP_OUTPUT_HANDLER_FINAL
),
ignore sa valeur de retour,
retourne le contenu du tampon de sortie actif
et désactive ce dernier.
ob_get_clean() échouera
sans un tampon de sortie actif démarré avec le drapeau
PHP_OUTPUT_HANDLER_REMOVABLE
.
ob_get_clean()
supprimera le contenu du tampon de sortie actif
même s'il a été démarré sans le drapeau
PHP_OUTPUT_HANDLER_CLEANABLE
.
Cette fonction ne contient aucun paramètre.
Renvoie le contenu du tampon de sortie actif en cas de succès
ou false
en cas d'échec.
ob_get_clean() renverra false
mais ne générera pas de E_NOTICE
s'il n'y a pas de tampon de sortie actif.
Si la fonction échoue, elle génère une E_NOTICE
.
Exemple #1 Exemple avec ob_get_clean()
<?php
ob_start();
echo "Bonjour le monde !";
$out = ob_get_clean();
$out = strtolower($out);
var_dump($out);
?>
L'exemple ci-dessus va afficher :
string(18) "bonjour le monde !"
The definition should mention that the function also "turns off output buffering", not just cleans it.
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 ...
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();
?>
<?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)
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().
Notice that the function beneath does not catch errors, so throw in an @ before those ob_* calls