Maison >développement back-end >tutoriel php >Explication détaillée de l'exemple output_buffering basé sur le cache de sortie php

Explication détaillée de l'exemple output_buffering basé sur le cache de sortie php

伊谢尔伦
伊谢尔伦original
2017-06-24 13:35:191416parcourir

Clarifiez d'abord l'ordre de sortie de PHP

1. Activez le cache de sortie php : echo,print -> php output_buffring -> - > mise en mémoire tampon du navigateur -> navigateur affichage
2. Le cache de sortie PHP n'est pas activé : mise en mémoire tampon du serveur d'impression -> ; affichage du navigateur
Clarifiez également le cache de sortie du navigateur : IE est de 256 octets, Chrome et FireFox sont de 1000 octets. Ce n'est que lorsque les données de sortie atteignent cette longueur ou que le script se termine que le navigateur affichera les données sur la page

Parlons de plusieurs paramètres PHP et API utilisés : configuration output_buffering dans 1.php.ini

•Off : signifie désactiver le cache de sortie PHP
•On : activer l'infini Cache de sortie
•4096 : ouvre le cache de sortie d'une taille de 4096 octets


Configuration Implicit_flush dans 2.php.ini
•On : indique chaque sortie (comme echo , print) et appelle automatiquement la fonction flush(), directement en sortie
•Off : contrairement à On, flush() ne sera pas appelé après chaque sortie. Il ne sortira pas tant que la mémoire tampon du serveur n'est pas pleine, mais nous pouvons l'utiliser. fonction flush() à la place, peu importe si elle n'est pas activée, mais elle est plus flexible


3.fonction ob_flush() : Supprimer les données dans la mise en mémoire tampon PHP et placez-les dans la mise en mémoire tampon du serveur
Fonction 4.flush() : supprimez les données de la mise en mémoire tampon du serveur et placez-les dans la mise en mémoire tampon du navigateur


5.Fonction ob_start() : Je ne sais pas grand chose sur cette fonction maintenant, car une fois activée, la sortie ne sera pas contrôlée par ob_flush() Même si ob_flush(). et flush() sont utilisés, les données ne peuvent pas être affichées immédiatement sur le navigateur. Ce que je sais maintenant, c'est que si output_buffering=Off, même si ob_start() est utilisé, les données de sortie ne peuvent pas être mises en cache. Si output_buffering=On, la sortie. les données peuvent être mises en cache par PHP même si ob_start() n'est pas utilisé, donc je pense que ob_start est relativement inutile, donc je vais l'ignorer pour le moment
Ensuite, regardons le code (définissez output_buffering =4096, implicit_flush=Off)

<html>
     <body>
         <?php
             // ob_start();    //这玩意开了就会不正常,输出不受ob_flush()控制,不知道到底干嘛用
             // echo str_repeat(&#39; &#39; ,1000);    //IE缓存256Bytes
             echo str_repeat(&#39; &#39; ,1000);    //Chrome和FF缓存1000Bytes,这里用来先将浏览器缓存用掉,但是很疑惑这一行输出为什么没有被output_buffering存起来,而是直接输出了
             for($i=0;$i<5;$i++) {
                 echo $i.&#39;<br />&#39;;
                 ob_flush();
                 flush();
                 sleep(1);
             }
         ?>
     </body>
 </html>

La sortie du code ici est sortie ligne par ligne. Veuillez vous référer au principe spécifique. Jetons un coup d'œil aux effets de ob_flush(). et fonctions flush()
Si l'une de ces deux fonctions est manquante, selon mes paramètres, je dois attendre que 0, 1, 2, 3 et 4 soient mis en cache et enfin les afficher ensemble
Enfin
citantun paragraphe du blog de Laruence, j'espère qu'il sera utile à la compréhension de tous

La description de ob_flush/flush dans le manuel est de rafraîchir le tampon de sortie, et il doit également être utilisé conjointement . Cela va donc semer la confusion chez beaucoup de gens...

En fait, les deux opèrent sur des objets différents. Dans certains cas, flush ne fait rien du tout..

Le. La série de fonctions ob_* fait fonctionner PHP lui-même. Tampon de sortie.

Donc, ob_flush consiste à actualiser le propre tampon de PHP.

Et flush, à proprement parler, n'est disponible qu'en PHP en tant que Module

(handler ou filter) est installé. Il s'agit de rafraîchir le buffer du WebServer (qui peut être considéré comme faisant spécifiquement référence à apache).Sous la sapi du module apache, flush will. appelle le membre flush de sapi_module

Pointeur de fonction

, appelle indirectement l'API d'Apache : ap_rflush actualise le tampon de sortie d'Apache. Bien sûr, le manuel indique également qu'il existe d'autres modules d'Apache qui peuvent modifier le résultat de cette action. .1 .Certains modules Apache, tels que mod_gzip, peuvent effectuer eux-mêmes la mise en cache des sorties, 2 Cela empêchera les résultats générés par la fonction flush() d'être envoyés immédiatement au navigateur client.
3.
4. Même le navigateur mettra en cache le contenu reçu avant de l'afficher. Par exemple, Netscape
5. Le navigateur mettra le contenu en cache jusqu'à ce qu'il reçoive une nouvelle ligne ou le début de la balise html, et le tableau entier ne sera affiché que
6. étiqueter.
7.
8. Certaines versions de Microsoft Internet Explorer ne commenceront à afficher la page qu'après avoir reçu 256
9 octets, donc des espaces supplémentaires doivent être envoyés pour que cela
10. Certains navigateurs affichent. contenu des pages.
Donc, l'ordre correct pour utiliser les deux est. D'abord ob_flush, puis flush,
Bien sûr, sous d'autres sapi, vous ne pouvez pas appeler flush, mais pour assurer la portabilité de votre code, c'est le cas. recommandé Pour une utilisation ensemble.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn