Maison  >  Article  >  développement back-end  >  tampon php

tampon php

不言
不言original
2018-05-15 17:46:433135parcourir

Cet article présente la connaissance du tampon PHP. Maintenant, je le partage avec vous et donne une référence aux amis qui ont besoin d'aide. Jetons un coup d'œil ensemble

Qu'est-ce qu'un tampon ?
Pour faire simple, la fonction du tampon est de mettre d'abord le contenu d'entrée ou de sortie dans la mémoire sans l'afficher ni le lire. Quant à savoir pourquoi il y a un tampon, c'est une question très large
.

En fait, le rôle le plus essentiel du tampon est de coordonner le fonctionnement du processeur à grande vitesse et des périphériques IO relativement lents (disques, etc.).

Si vous voulez comprendre le tampon de PHP, vous devez savoir où le tampon est défini lors de l'exécution de PHP.
Lors de l'exécution de PHP, si vous rencontrez du code qui génère des données telles que echo print_r, PHP placera les données à sortir dans le propre tampon de PHP et attendra la sortie.

Lorsque le propre tampon de PHP reçoit une instruction pour afficher le contenu du tampon, il affichera les données dans le tampon vers Apache. Apache reçoit les données sorties par PHP puis stocke les données dans Apache lui-même. Dans le tampon, attendez la sortie

. Lorsqu'Apache reçoit l'instruction et veut juste afficher le contenu du tampon, il affichera le contenu du tampon et le renverra au navigateur. On peut voir que PHP veut afficher l'heure des données, il passera par deux tampons (. d'abord le sien, puis celui d'Apache), puis revenez au navigateur.

Quel rôle le tampon joue-t-il en PHP ?
1. été généré avant d'utiliser la fonction d'en-tête, ce qui entraînera certaines erreurs, telles que Impossible de modifier les informations d'en-tête – en-têtes déjà envoyés par ;

1

1

2


echo "this is test";

header("LOCATION http://www.baidu.com");

2

echo "ceci est un test";

en-tête("LOCALISATION http://www.baidu.com");


La raison de cette erreur est que certaines données ont été sorties avant l'en-tête, et lors de la sortie de ces données, Apache enverra simultanément un état de réponse au navigateur (puisqu'il y a une sortie, cette demande est valide), et puis vous utilisez à nouveau la fonction d'en-tête
pour envoyer l'en-tête http, cette erreur sera renvoyée. L'erreur signifie : l'en-tête HTTP a été envoyé et vous ne pouvez pas le modifier
Pourquoi l'utilisation d'un tampon peut-elle éviter cette erreur. ?
Parce que la fonction d'en-tête n'est pas affectée par le tampon. Lorsqu'il rencontre la fonction d'en-tête, PHP exécute immédiatement Apache pour envoyer cet en-tête http au navigateur
Et après les données de sortie, PHP ouvre le tampon de sortie. les données seront stockées dans le tampon et attendront la sortie. Cela peut éviter les erreurs survenues auparavant.
2. Lors de l'écriture d'un programme de téléchargement de fichiers via PHP.
Afin de rendre le téléchargement de fichiers plus sûr et d'améliorer plus de contrôlabilité, De nombreux amis aiment utiliser PHP pour écrire des pages de téléchargement de fichiers. Le principe est très simple, il s'agit de lire et d'afficher le contenu du fichier via fwrite, puis d'envoyer l'en-tête HTTP via header et d'informer le navigateur qu'il s'agit d'une pièce jointe. cela
peut avoir pour effet de fournir des téléchargements
Si vous utilisez la méthode ci-dessus pour fournir une page de téléchargement, vous rencontrerez un problème d'efficacité si un fichier est volumineux, supposons qu'il fait 100 Mo, alors sans allumer le. sortie du tampon, toutes les 100 millions de données doivent être lues, puis renvoyées à la page en même temps. Si cela est fait, l'utilisateur n'obtiendra pas de réponse tant que toutes les données ne seront pas lues
, ce qui réduit et améliore l'expérience utilisateur. 🎜> Si le tampon de sortie est activé, lorsque le programme PHP a fini de lire une certaine section du fichier, il l'affichera immédiatement sur Apache, puis laissera Apache revenir immédiatement au navigateur, ce qui peut réduire le temps d'attente de l'utilisateur. Que faire des données ? On peut écrire une boucle while pour lire le fichier section par section
Chaque fois qu'une section est lue, elle sera sortie immédiatement jusqu'à ce que le fichier entier soit sorti, afin que le navigateur puisse continuer à recevoir données, et il n'est pas nécessaire d'attendre que tous les fichiers soient lus

De plus, cette approche résout également un autre problème très grave, par exemple, si un fichier fait 100 Mo, si le tampon n'est pas activé, tous les 100 M de fichiers doivent être lus dans la mémoire puis sortis. Cependant, que se passe-t-il si le programme PHP a une limite de mémoire ? Afin de garantir la stabilité du serveur, l'administrateur fixe généralement une limite à l'exécution de PHP

. mémoire (via la limite mémoire totale de php.ini, qui est par défaut La valeur est 8 Mo), c'est-à-dire que la mémoire utilisée par chaque programme PHP ne peut pas utiliser plus que cette valeur et le fichier à lire. est de 100 Mo, il n'y a tout simplement pas assez de mémoire pour lire le fichier. Cette fois, nous devons utiliser la méthode
ci-dessus pour résoudre ce problème. Ne lisez qu'un certain paragraphe à la fois, afin d'éviter les limitations de mémoire
. 3. Cache de fichiers statiques
De nombreuses entreprises disposent désormais d'un tel cache. L'exigence est que lorsqu'une certaine page est visitée pour la première fois, PHP sera exécuté, puis le contenu affiché sera renvoyé au navigateur en même temps. , le contenu affiché doit être enregistré sur le serveur, afin que lors de sa prochaine visite, il soit affiché directement. Affichez directement les fichiers enregistrés sur le serveur sans avoir à le faire fonctionner via PHP
C'est ainsi. appelé "cache de page statique". Alors, comment pouvons-nous renvoyer le contenu au navigateur et enregistrer les données sur le serveur en même temps ? Cela nécessite l'utilisation du tampon de sortie.

table>


Configuration liée au tampon de sortie

Dans PHP.INI, il existe deux éléments de configuration étroitement liés au tampon
1.output_buffering
Cette configuration Ce qui affecte directement le tampon de PHP lui-même est constitué des trois paramètres de configuration. on/off/xK (x est une valeur entière)
on - ouvre le tampon
off - ferme le tampon
256k - Active le tampon, et lorsque le contenu du tampon dépasse 256k, le tampon sera automatiquement rafraîchi (envoyer les données à Apache) ;

2. implicit_flush
Cette configuration affecte directement le tampon Apache, il y a 2 paramètres de configuration. on/off
on - Actualise automatiquement le tampon Apache, c'est-à-dire que lorsque php envoie des données au tampon Apache, il n'a pas besoin d'attendre d'autres instructions et renvoie directement la sortie au navigateur
off - Do ne rafraîchit pas automatiquement le tampon Apache. Après avoir reçu les données, attendez la commande d'actualisation
Fonctions liées au tampon

1 ob_implicit_flush
La fonction est la même que implicit_flush, que ce soit le cas. Flush automatique du tampon d'Apache
2.flush
consiste à envoyer des instructions à Apache pour permettre à Apache de rafraîchir son propre tampon de sortie
3.ob_start
Ouvrez le tampon de sortie, quel que soit le fichier php.ini. à configurer, si vous utilisez cette fonction, même si output_buffering est désactivé, le tampon de sortie sera ouvert
La fonction ob_start accepte également un paramètre, qui est un rappel d'une fonction, ce qui signifie qu'avant de saisir le contenu du tampon , vous devez utiliser Appeler les paramètres passés pour traiter le contenu du tampon une fois, puis le mettre dans le tampon
4.ob_flush
demande à php lui-même d'actualiser son propre tampon et d'envoyer les données à Apache
5.ob_clean
Effacer le contenu du tampon php
6.ob_end_clean
Effacer le contenu du tampon php et fermer le tampon de sortie
7.ob_end_flush
Envoyer le contenu de celui de php tampon vers Apache et efface le contenu dans son propre tampon
8.ob_get_clean
Après avoir obtenu le contenu du tampon, effacez le tampon.
9.ob_get_contents
Obtenez le contenu du tampon de sortie
🎜> 10.ob_get_flush
Obtenir le contenu dans le tampon et envoyer le contenu à Apache
11.ob_get_length
Obtenir la longueur du contenu dans le tampon
12.ob_list_handlers
Obtenir lors de l'exécution ob_start, Le nom de la fonction rappelée, par exemple :
ob_start('ob_gzhandler');
print_r(ob_list_handlers);
affichera ob_gzhandler;
13.ob_gzhandler
La fonction de cette fonction est comme ob_start Le paramètre de rappel, avant que le tampon ne soit actualisé, appellera cette fonction pour effectuer une compression gzip ou dégonfler les données. Cette fonction nécessite la prise en charge de l'extension zlib

Utilisation du tampon. -contenu lié
1. La relation d'ordre entre ob_flush et flush. D'après l'analyse ci-dessus, nous pouvons voir que ob_flush est lié à PHP lui-même, tandis que flush exploite le tampon apache. Ainsi, lorsque nous utilisons ces deux fonctions, nous devons d'abord les exécuter. ob_flush,
puis exécuter flush, car nous devons d'abord envoyer les données de PHP à Apache, puis les renvoyer d'Apache au navigateur. Si php n'a pas actualisé les données à Apache, et flush est appelé, apache n'aura rien Les données sont renvoyées au navigateur

2. Certains navigateurs n'afficheront pas les données s'ils reçoivent trop peu de caractères, comme l'ancienne version d'IE (cela doit être le cas). plus de 256 Ko à afficher). De cette façon, cela posera une question. Il est clair que le tampon est actualisé à la fois dans php et dans Apache, mais le navigateur n'affiche pas les données souhaitées. C'est peut-être la raison. vous pouvez afficher les données. Ajoutez plusieurs espaces après pour remplir les données afin de garantir que le navigateur ne causera pas de problèmes aussi étranges

3. Certains serveurs Web ont certaines restrictions sur leurs propres tampons de sortie, comme nginx. Il existe une configuration fastcgi_buffer_size 4k, ce qui signifie qu'elle sera actualisée lorsque le contenu de son propre tampon de sortie atteint 4K, donc afin de garantir les données du contenu, vous pouvez ajouter le code suivant pour garantir la longueur du contenu

1

2

1

2

3

4

5

6


ob_start();

echo 'aaa';

$string = ob_get_contents();

file_put_contents('a.html', $string);

ob_flush();

flush();

3

4

5

6

ob_start();

echo 'aaa';

$string = ob_get_contents();

file_put_contents('a.html', $string);

ob_flush();

flush();

1

1

2

3

4

5


<?php

echo str_repeat(" ",4096);

?>

23

4

5

<?php

echo code> <code class="php function">str_repeat(" ",4096);

 ?


4. Dans Apache, si vous activez le module de compression de mod_gzip, cela peut empêcher l'actualisation de votre fonction flush. La raison est que mod_gzip a son propre tampon de sortie lorsque PHP exécute la fonction flush, indique Apache. pour actualiser le tampon de sortie, mais si le contenu doit être compressé, Apache affichera le contenu dans son propre module mod_gzip. mod_gzip a également son propre tampon de sortie, et il ne sera pas affiché immédiatement, le contenu ne peut donc pas être affiché immédiatement. afin d'améliorer Dans ce cas, vous pouvez désactiver le module mod_gzip, ou ajouter le contenu suivant à httpd.conf pour désactiver la compression

1

1


SetEnv no-gzip dont-vary


SetEnv no-gzip dont-vary

tr>

Recommandations associées :

Explication détaillée pour accélérer votre site en actualisant le tampon PHP

Qu'est-ce qu'un tampon 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