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?
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.
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
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.
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.