Maison  >  Article  >  développement back-end  >  Explication détaillée du contrôle du tampon de sortie PHP

Explication détaillée du contrôle du tampon de sortie PHP

墨辰丷
墨辰丷original
2018-06-01 14:47:411456parcourir

Cet article présente principalement le contrôle de la mise en mémoire tampon de sortie PHP. Des informations pertinentes détaillées et des exemples de codes simples sont fournis ici pour vous aider à apprendre et à vous référencer. Les amis intéressés peuvent se référer à

Introduction à la mise en mémoire tampon PHP.

En fait, mon impression de la série php ob est encore très vague, je ne sais pas grand-chose sur la façon d'y jouer, je n'ai vraiment pas une compréhension profonde de celle-ci. ces contenus. En tant que phper, j'ai très honte. Après avoir effectué des recherches en ligne et copié les uns les autres, le phénomène décrit par l'auteur ne peut pas se produire lors de l'exécution du code. Cet article est un produit consciencieux et le code a été exécuté par l'auteur.

Lors de l'exécution d'une sortie, telle que echo, print. La sortie n'est pas envoyée immédiatement au serveur Web, mais les données sont écrites dans le tampon php. L'avantage du mécanisme php output_buffering améliore certainement les performances. En fait, le fichier php est finalement affiché sur le navigateur et passe par trois étapes de mise en mémoire tampon : php buffer=》web server buffer=》browser buffer. Enfin affiché dans le navigateur

Par défaut, le tampon php est activé et la valeur par défaut du tampon est 4096, soit 4 Ko. Vous pouvez trouver la configuration output_buffering dans le fichier de configuration php.ini. Le tampon est un espace d'adressage mémoire. La taille par défaut du système Linux est généralement de 4096 (4 Ko), ce qui correspond à une page mémoire. Il est principalement utilisé pour stocker des zones de transfert de données entre des appareils ayant des vitesses non synchronisées ou des appareils ayant des priorités différentes. Grâce au tampon, les processus peuvent moins s'attendre les uns les autres. Voici un exemple plus général. Lorsque vous ouvrez un éditeur de texte pour modifier un fichier, chaque fois que vous saisissez un caractère, le système d'exploitation n'écrit pas immédiatement le caractère directement sur le disque, mais l'écrit d'abord dans le tampon lors de l'écriture. un tampon est plein, les données du tampon seront écrites sur le disque. Bien entendu, lorsque la fonction du noyau flush() est appelée, il est obligatoire de réécrire les données sales du tampon sur le disque.

Par exemple,

<?php
echo "南无阿弥陀佛<br>";
header("content-type:text/html;charset=&#39;utf-8&#39;");
echo "真善忍好!";
//output
//南无阿弥陀佛
//真善忍好

header() doit être appelé avant toute sortie réelle, mais notre programme a une sortie et fonctionne normalement. En regardant le code suivant :

<?phpecho "南无阿弥陀佛<br>";
ob_flush();
header("content-type:text/html;charset=&#39;utf-8&#39;");
echo "真善忍好!";
//output
//南无阿弥陀佛
//Cannot modify header information - headers already sent by (output started at E:\php\test.php:3)
//真善忍好

Le programme ci-dessus montre que le programme ne produit pas immédiatement et que le tampon est actualisé lorsque ob_flush la fonction est appelée sortie.

ob_flush() et flush()

les fonctions ob_flush() et flush() sont disponibles dans PHP manuel Vous pouvez le consulter pour des instructions détaillées. La différence entre les deux est :

ob_flush() consiste à actualiser le propre tampon de PHP

flush() consiste à actualiser le tampon du serveur Web. . Sortie vers le navigateur. Cependant, la situation suivante se produira :

  1. Certains programmes de serveur Web, notamment les programmes de serveur Web sous Win32, mettront toujours en cache la sortie du script avant d'envoyer les résultats au navigateur. . , jusqu'à la fin du programme.

  2. Certains modules Apache, tels que mod_gzip, peuvent mettre en cache leur propre sortie, ce qui empêchera l'envoi immédiat des résultats générés par la fonction flush() au navigateur client.

  3. Même le navigateur mettra en cache le contenu reçu avant de l'afficher. Par exemple, le navigateur Netscape met le contenu en cache jusqu'à ce qu'il reçoive un saut de ligne ou le début d'une balise HTML, et n'affiche pas l'intégralité du tableau tant qu'il n'a pas reçu une balise f16b1740fad44fb09bfe928bcc527e08.

  4. Certaines versions de Microsoft Internet Explorer ne commenceront à afficher la page qu'après avoir reçu 256 octets, donc des espaces supplémentaires doivent être envoyés pour permettre à ces navigateurs d'afficher le contenu de la page.

Par exemple :

<?php
/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo &#39;佛法无边&#39;."<BR>";
ob_flush();
flush();
sleep(1);
echo &#39;法轮常转&#39;;

//output

Le code ci-dessus est affiché ligne par ligne sur le navigateur Chrome IE. les navigateurs de la série affichent tout. En fait, il s'agit du quatrième élément ci-dessus. Certains navigateurs ne commencent à s'afficher que lorsqu'ils reçoivent 256 caractères. Remplacez le code ci-dessus par la forme suivante :

<?php
/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo str_pad(&#39;&#39;,240)."\n"; 
echo &#39;佛法无边&#39;."<BR>";
ob_flush();
flush();
sleep(1);
echo &#39;法轮常转&#39;;

//output

De cette façon, il sera affiché ligne par ligne sous IE car il dépasse 256 caractères.

ob Autres descriptions de fonctions

1.ob_end_flush et ob_end_clean

La fin se termine comme son nom l'indique, se ferme les zones tampon, les deux désactivent le tampon de sortie, l'une est le tampon de sortie et l'autre est claire. Par exemple,

<?php
/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo &#39;before&#39;;
ob_end_clean();
echo str_pad(&#39;&#39;,4096)."\n";
for ($i=10; $i>0; $i--) 
{ 
 echo $i;
 sleep(1);
}

Le code ci-dessus affiche l'intégralité du contenu en une seule fois, plutôt que de l'afficher un par un. ob_end_clean() ne désactive-t-il pas le tampon ? Pourquoi ne pas les afficher un par un ? En fait, comme nous l'avons dit plus haut, php n'est pas affiché directement sur le navigateur, mais sur le serveur web. Bien que php n'ait pas de mise en mémoire tampon. Mais il existe toujours un serveur Web. Ainsi, le code suivant :

/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo &#39;before&#39;;
ob_end_clean();
echo str_pad(&#39;&#39;,4096)."\n";
for ($i=10; $i>0; $i--) 
{ 
 flush();
 echo $i;
 sleep(1);
}

plus flush() le produira ligne par ligne. Si vous remplacez ob_end_clean par ob_end_flush, before sera affiché.

Pour les autres fonctions, veuillez vous référer au manuel, qui est relativement simple.

Résumé

Du script php au navigateur, il faut passer par php buffer=》web server buffer=》browser buffer. Enfin affiché au navigateur. Les deux sont indispensables. Nous avons donc besoin de ob_flush et flush et ajoutons echo str_pad('',4096) pour déboguer l'effet souhaité.

Résumé : ce qui précède représente l'intégralité du contenu de cet article, j'espère qu'il sera utile à l'étude de chacun.

Recommandations associées :

Fonctions de connexion, d'enregistrement et de modification de mot de passe implémentées en PHP

Explication détaillée des fonctions anonymes PHP et précautions

Utilisation de la fonction de rappel call_user_func_array en PHP

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