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?

64
demandé sur Adam Elsodaney 2010-11-16 08:10:48

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.

65
répondu mario 2017-02-06 19:49:32

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

29
répondu Dan Grossman 2010-11-16 05:30:56

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ément ob_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.

19
répondu Lightness Races in Orbit 2011-05-21 14:39:56

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.

10
répondu stillstanding 2017-05-23 12:10:00