W3docs

Fonction PHP ob_implicit_flush() : tout ce que vous devez savoir

Découvrez la fonction ob_implicit_flush() de PHP pour activer ou désactiver le vidage implicite du tampon de sortie, avec exemples et cas d'usage.

Par défaut, PHP collecte tout ce que votre script produit dans un tampon interne et l'envoie au client par morceaux. Le vidage implicite change ce comportement : il demande à PHP d'envoyer la sortie au client après chaque instruction de sortie au lieu d'attendre. La fonction ob_implicit_flush() est le commutateur intégré qui active ou désactive ce comportement. Cet article couvre sa syntaxe, ses paramètres, sa valeur de retour, ses cas d'usage concrets et les pièges courants.

Qu'est-ce que la fonction ob_implicit_flush() ?

La fonction ob_implicit_flush() active ou désactive le vidage implicite pour le niveau de tampon de sortie courant. Lorsqu'il est activé, PHP se comporte comme si vous appeliez ob_flush() automatiquement après chaque echo, print, printf ou print_r — la sortie est donc transmise immédiatement à la couche suivante plutôt que d'être retenue.

C'est particulièrement utile pour les scripts à longue exécution où vous voulez que l'utilisateur voie la progression en temps réel — par exemple un journal de déploiement, une exportation CSV ou une barre de progression — au lieu de regarder une page blanche jusqu'à la fin du script.

Important : le vidage implicite n'affecte que le tampon de sortie propre à PHP. Les serveurs web comme Apache, Nginx et PHP-FPM maintiennent leurs propres tampons, tout comme le navigateur. Pour envoyer réellement les octets jusqu'à l'utilisateur, vous avez généralement besoin d'un appel séparé à flush() et, idéalement, d'aucun tampon ob_start() retenant les données.

Syntaxe

ob_implicit_flush(bool $enable = true): void

Paramètres

ParamètreTypeDescription
$enablebooltrue active le vidage implicite, false le désactive. Vaut true par défaut.

Valeur de retour

Avec PHP 8.0 et versions ultérieures, la fonction retourne void. Avec PHP 7.x et versions antérieures, elle retournait l'état précédent du vidage implicite sous forme de bool. En raison de ce changement, ne comptez pas sur sa valeur de retour dans du code devant fonctionner sur plusieurs versions.

Comment utiliser la fonction ob_implicit_flush() ?

Le schéma courant consiste à désactiver le tampon de PHP (ou à le fermer), à activer le vidage implicite et à appeler flush() pour contourner le tampon du serveur :

<?php

// Turn off PHP's output buffering for this script so nothing is held back.
while (ob_get_level() > 0) {
    ob_end_flush();
}

ob_implicit_flush(true);

for ($i = 1; $i <= 3; $i++) {
    echo "Step {$i} done\n";
    flush();   // defeat the web server buffer
    sleep(1);  // simulate slow work
}

echo "All steps finished\n";

Chaque ligne s'affiche dans le navigateur avec environ une seconde d'écart au lieu d'apparaître toutes en même temps à la fin. ob_implicit_flush(true) supprime la nécessité d'appeler ob_flush() après chaque echo, tandis que flush() pousse les données au-delà du tampon du serveur web.

En ligne de commande, les couches de mise en tampon au-dessus de PHP n'existent pas, donc la sortie se diffuse déjà ligne par ligne — ce qui fait de la CLI un bon endroit pour valider votre logique avant de déployer derrière un serveur web.

Quand l'utiliser ?

  • Affichage de progression en streaming — tâches d'importation, traitements par lots, ou tout ce où une ligne de statut par élément maintient la connexion active et l'utilisateur informé.
  • Server-Sent Events (SSE) — envoi de lignes data: au navigateur en temps réel.
  • Débogage des problèmes de mise en tampon — l'activer temporairement vous aide à voir exactement où la sortie est bloquée.

En général, vous ne souhaitez pas le vidage implicite pour les pages normales : envoyer la sortie en un seul lot est plus efficace et permet à PHP de définir des en-têtes plus tard dans le script.

Pièges courants

  • Ce n'est pas suffisant seul. La mise en tampon au niveau du serveur (et gzip/mod_deflate) peut toujours retenir votre sortie. Pour une diffusion en temps réel, vous devrez peut-être désactiver la compression et appeler flush().
  • Un tampon ob_start() actif le remplace. Si un tampon est ouvert, la sortie y va en premier. Fermez-le avec ob_end_flush() ou ob_end_clean() avant de compter sur le vidage implicite.
  • Vous ne pouvez pas envoyer d'en-têtes après un vidage. Une fois qu'une sortie est vidée, les appels à header() échoueront avec « headers already sent ».

Fonctions associées

Conclusion

La fonction ob_implicit_flush() fournit un simple commutateur pour que PHP envoie la sortie immédiatement après chaque instruction au lieu de la mettre en tampon. Combinée avec flush() et une bonne connaissance des tampons côté serveur, elle vous permet de créer des indicateurs de progression et des réponses en streaming pour les scripts à longue exécution. Pour les pages ordinaires, laissez-la désactivée et laissez PHP regrouper la sortie pour vous.

Practice

Pratique
Que fait ob_implicit_flush(1) en PHP ?
Que fait ob_implicit_flush(1) en PHP ?
Was this page helpful?