web-dev-qa-db-fra.com

PHP buffer ob_flush () vs. flush ()

Quelle est la différence entre ob_flush() et flush() et pourquoi dois-je appeler les deux?

La référence ob_flush() dit:

Cette fonction enverra le contenu du tampon de sortie (le cas échéant).

La référence flush() dit:

Vide les tampons d'écriture de PHP et quel que soit le backend PHP utilise (CGI, un serveur Web, etc.).

Cependant, il continue de dire:

[il] ne pourra peut-être pas remplacer le schéma de mise en mémoire tampon de votre serveur Web…

Donc, il me semble que je pourrais simplement utiliser ob_flush() tout le temps. Cependant, j'obtiens des résultats étranges lorsque je fais cela. Quelqu'un pourrait-il expliquer en termes simples ce qui se passe ici?

74
Ben

ob_flush Envoie un tampon lancé par l'application. Il peut y avoir plusieurs ob_start() imbriqués dans n'importe quel script PHP. ob_flush Transmet le contenu actuel à la couche supérieure.

PHP lui-même peut (à sa discrétion) mettre en tampon la sortie. Cela dépend du back-end. Mais généralement FastCGI possède un tampon de socket à lui tout seul. Par conséquent, flush() doit également être invoquée pour envoyer le contenu actuel au serveur Web.

Et maintenant, le serveur Web peut lui-même implémenter un autre schéma de mise en mémoire tampon (mod_deflate Ou filtre de contenu), sur lequel vous n'avez aucune influence. Mais c'est rarement, car il doit être configuré spécifiquement.

Quoi qu'il en soit, utilisez les deux.

71
mario

ob_flush vide les tampons de sortie vous créé avec une fonction comme ob_start

flush vide la sortie mise en mémoire tampon du script PHP lui-même vers son appelant

32
Dan Grossman

ob_flush() est un vidage de haut niveau. Il vide les tampons de haut niveau et place tout le contenu dans les tampons internes de bas niveau prêts à être envoyés.

  • Notez que la famille de fonctions ob_ Crée piles de tampons, donc simplement écrire aveuglément ob_flush() partout va en effet vous donner des "résultats étranges" si le code était écrit pour tirer parti de cet empilement.

flush() est un vidage de bas niveau, indiquant à PHP de vider ses tampons de données internes de bas niveau.

En dessous de cela, il y aura des tampons de couche socket; en dessous, il y a des tampons de couche réseau. Et, au niveau le plus bas, la file d’électrons descendant le câble de données.

Je suppose que cela est en relation avec votre question précédente . L'avantage significatif de l'utilisation de la mise en mémoire tampon de sortie est lorsqu'elle est utilisée avec la compression de données. Si vous n'utilisez pas ob_gzhandler, il y a peu à gagner. flush seul, il suffit de valider toutes les données de sortie qui sont encore sur le serveur. Avec ob_start et ses homologues ob_flush, ob_end_clean et ob_end_flush, tout ce qui attend d'être compressé (regardez flush et ob_flush comme faisant référence à différents compartiments - ob envoie des données à flush, flush envoie des données au navigateur - peut ne pas être précis mais c'est l'idée) sera emballé et envoyé au client.

11
bcosca