Tampon PHP ob flush () vs. flush()
Quelle est la différence entre ob_flush()
et flush()
et pourquoi dois-je appeler?
Le ob_flush()
de référence dit:
cette fonction enverra le contenu du tampon de sortie (le cas échéant).
Le flush()
de référence dit:
chasse les tampons d'écriture de PHP et tout ce qui backend PHP utilise (CGI, un serveur web, etc.).
cependant, il continue à dire:
[il] peut ne pas être en mesure de remplacer le tampon de régime de votre serveur web...
donc, il me semble que je pourrais utiliser ob_flush()
tout le temps. Cependant, j'obtiens des résultats étranges quand je le fais. Quelqu'un pourrait-il expliquer en termes simples ce qui se passe ici?
4 réponses
ob_flush
envoie un tampon initié 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 pourrait (à sa propre discrétion) sortie de tampon. Cela dépend de la fin. Mais habituellement FastCGI
a un tampon de socket sur lui-même. Par conséquent flush()
doit être invoqué aussi bien pour envoyer le contenu actuel au serveur web.
et maintenant le serveur web peut lui-même implémenter un autre système de buffering ( mod_deflate
ou filtre de contenu), sur lequel vous n'avez aucune influence. Mais cela est rare, car il doit être configuré spécifiquement.
utilisez les deux.
ob_flush
tampons de sortie flushes vous créé avec une fonction comme ob_start
flush
sortie tampon de flush du script PHP lui-même à son interlocuteur
ob_flush()
est un haut-niveau de la chasse d'eau. Il nettoie les tampons de haut niveau et met tout le contenu dans les tampons internes de bas niveau prêts à envoyer.
- notez que la famille de fonctions
ob_
crée empilements de tampons, donc simplement écrire aveuglémentob_flush()
partout va en effet vous donner" des résultats étranges " si le code a été écrit pour tirer profit de ce cumul.
flush()
est une chasse d'eau de faible niveau, donnant L'instruction à PHP de vider ses tampons de données internes de faible niveau.
au-dessous de ce still, il y aura des tampons de couche socket; au-dessous de cela, il y a des tampons de couche network. Et, au niveau le plus bas, la queue d'électrons descendant le câble de données.
je suppose que c'est en relation avec votre question précédente . L'avantage significatif de l'utilisation du tampon de sortie est quand il est utilisé en même temps que la compression de données. Si vous n'utilisez pas ob_gzhandler
, il y a peu à gagner. flush
ne fera que propager les données de sortie qui sont encore sur le serveur. Avec ob_start
et ses contreparties ob_flush
, ob_end_clean
et ob_end_flush
, tout ce qui est en attente d'être comprimé (regardez flush
et ob_flush
comme se référant à différents seaux - ob
envoie des données à flush
, flush
envoie des données au navigateur - peut ne pas être exacte, mais c'est l'idée) sera enveloppé et envoyé au client.