Maison >développement back-end >Problème PHP >Comment fermer le tampon en php

Comment fermer le tampon en php

青灯夜游
青灯夜游original
2021-09-28 19:08:142652parcourir

Comment désactiver le tampon en php : 1. Ouvrez le répertoire d'installation de PHP, recherchez et ouvrez le fichier de configuration "php.ini" ; 2. Dans le fichier de configuration, recherchez l'élément "output_buffering" et définissez la valeur de l'élément sur "Off". C'est tout.

Comment fermer le tampon en php

L'environnement d'exploitation de ce tutoriel : système Windows 7, PHP version 7.1, ordinateur DELL G3

Tampon PHP (buffer)

Les informations de sortie du script sont d'abord mises dans le tampon, et seulement lorsque le tampon est plein ou une fois l'exécution du script terminée, les données seront transférées à l'étape suivante. Vous pouvez trouver l'élément de paramètre output_buffering dans le fichier de configuration php.ini. Ma configuration par défaut (Windows/XAMPP v3.2.2) est 4096

Comment fermer le tampon en php

Si elle est définie sur On, le tampon est disponible et il n'y a pas de limite de taille ;

Si set est désactivé, le tampon n'est pas disponible ;

S'il est défini sur un nombre entier, le tampon est disponible et a la taille définie en octets

Il convient de noter que ini_set ne peut pas définir la taille du tampon. a été effectué lors de l'initialisation de l'environnement d'exécution du script. D'accord, la définition du tampon est effectuée ; output_buffering est toujours désactivé par défaut en mode cli.

Alors la question est : quelle est la différence entre fermer et ouvrir le tampon ? À quoi sert la taille initiale du tampon ? Le mode cli est désactivé par défaut. Peut-il être activé si l'entreprise en a besoin ? Quels sont les avantages de la zone de cache ?

1. Quelle est la différence entre fermer et ouvrir le tampon ?

Inspection du code réussie

Lorsque output_buffering est configuré sur 4096, exécutez le code

Résultat de sortie : après avoir attendu 3 secondes, le début et la fin sont affichés en même temps

Lorsque Output_buffering est configuré sur Off, exécutez le même code

Résultat de sortie : le début est affiché en premier, et après 3 secondes d'attente, la fin est affichée. Les résultats sont exactement les mêmes ~ mais en observant le processus en cours, j'ai trouvé une différence surprenante. Si la mise en mémoire tampon est désactivée, « start » est affiché en premier, puis « end » est affiché après 3 secondes d'attente. Lorsque le tampon est activé, il attendra la fin de l'exécution du script et affichera les résultats ensemble

Dans cet exemple, flush est utilisé pour actualiser le tampon Apache, ce qui revient à établir une connexion directe entre le tampon PHP et le navigateur, afin que notre attention puisse se concentrer sur le tampon PHP lui-même.

À travers un exemple frappant, le tampon PHP est comme une grande maison.Chaque fois qu'une fonction de sortie telle que echo est exécutée, les données sont jetées dans cette grande maison jusqu'à ce que l'exécution du script soit terminée ou que la fonction ob_flush soit exécutée pour transférer les données depuis. la grande maison libérée et jetée dans le tampon du serveur Web. Après avoir fermé le tampon PHP, la fonction echo est exécutée. Que dois-je faire s'il n'y a pas de grande maison pour la mettre ? Je dois la remettre directement au tampon du serveur Web.

Grâce à des exemples et aux résultats d'exécution de code, nous pouvons comprendre que le soi-disant tampon PHP est un hub de stockage de données développé par PHP lui-même, et qu'une série de fonctions ob fonctionnent à cet effet. (Citer quelques exemples de fonctions)

ob_clean(); //Supprime le contenu du tampon interne sans fermer le tampon (pas de sortie).

ob_end_clean(); //Supprime le contenu du tampon interne et ferme le tampon (pas de sortie).

ob_get_contents(); //Renvoie le contenu du tampon, ne produit pas

ob_get_length(); //Renvoie la longueur du tampon interne. Si le tampon n'est pas activé, cette fonction renvoie FALSE.

2. Quel est le rôle de la taille initiale du buffer ?

Changer output_buffering de 4096 à 5 pour faciliter les tests

Exécuter le code

Description de la sortie : Après avoir attendu 3 secondes, sortie 1234end

Exécuter le code

Description de la sortie : Sortie 12345 , attends 3 Quelques secondes plus tard, la sortie se termine

La comparaison des sorties peut clairement illustrer la différence.

Le tampon ne peut contenir que 5 octets de données. Si les données introduites sont inférieures à la valeur maximale, elles peuvent être stockées en premier. Si elles sont supérieures ou égales à la valeur critique, les données doivent être stockées. expulsé C'est ce que nous faisons manuellement. La fonction ob_flush a un effet.

3. Le mode cli est désactivé par défaut. Peut-il être activé si l'entreprise en a besoin ?

Cette question peut être complétée. En mode non-cli, si php.ini définit le tampon pour qu'il soit désactivé, mais que l'entreprise a besoin d'utiliser le tampon, que dois-je faire ? Bien sûr, ce ne sera pas si difficile. Voici une autre fonction ob,

ob_start(); //Ouvre un tampon de sortie. Toutes les informations de sortie ne sont plus envoyées directement au navigateur, mais sont enregistrées dans le tampon de sortie. .

Maintenant que nous savons que le tampon PHP est similaire au concept de zone de stockage de données temporaire, revenons en arrière et regardons le code source de TP5.

Premier coup d'œil à l'explication des fonctions ob_get_level et ob_get_clean

ob_get_level() : Renvoie le niveau d'imbrication du mécanisme de mise en mémoire tampon de sortie.

ob_get_clean() : Récupère le contenu du tampon actuel et supprime le tampon de sortie actuel.

Nous pouvons également apprendre une ou deux choses à partir du code. Si l'acquisition du niveau est supérieure à 0, récupérez le contenu du tampon et supprimez le tampon, puis ouvrez-en un nouveau via ob_start. la "réapplication" expliquée dans les commentaires.

Ce qu'on appelle l'imbrication est expliqué ici. Quant à savoir quand la valeur du niveau sera 0, et si ce n'est pas 0, qu'est-ce que c'est ? Veuillez désactiver php.ini Output_buffering et Output pour voir le résultat. De plus, ob_start plusieurs fois et ob_get_level plusieurs fois, essayons de comparer les résultats de sortie.

Jetons d'abord un coup d'œil aux deux modèles


Lorsque ob_start ouvre un nouveau tampon plusieurs fois, la structure de données est construite comme le deuxième type, qui est l'imbrication. ob_get_level renvoie le niveau imbriqué.

Personnellement compris, l'imbrication peut être comparée au mécanisme de streaming de Java. Les données d'un tampon sont sorties vers le tampon suivant, puis des opérations personnalisées peuvent être effectuées sur les données.

En regardant maintenant le code source de TP5, l'idée est plus claire. Si le système initialise le tampon, supprimez-le d'abord, puis rouvrez-le car sa taille peut être limitée. La taille de la zone de cache ouverte en exécutant ob_start est "assez grande", mais il n'y a pas de description spécifique de sa taille. Je sais seulement que quelle que soit la taille des données écrites, elles ne seront envoyées qu'à la fin. le script

4. Quels sont les avantages de la zone cache ?

Les données de sortie PHP sont envoyées au serveur Web. Si echo est exécuté et envoyé une fois, cela augmente la consommation de ressources. Il est préférable de les stocker en mémoire et de les envoyer uniformément, ce qui est plus efficace.

Les requêtes Web contiennent des en-têtes HTTP et il ne peut y avoir de sortie avant que les en-têtes ne soient définis. Le tampon PHP fait ce travail pour nous, en produisant diverses données avant d'envoyer l'en-tête. Le tampon enverra d'abord les informations d'en-tête à WebSever, puis enverra les paquets de données de manière uniforme.

Apprentissage recommandé : "Tutoriel vidéo 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