Maison  >  Article  >  développement back-end  >  mécanisme de mise en mémoire tampon de la fonction ob en php

mécanisme de mise en mémoire tampon de la fonction ob en php

墨辰丷
墨辰丷original
2018-06-07 17:39:431475parcourir

Cet article le présente principalement. Les amis intéressés peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Lorsqu'il s'agit de buffering, c'est-à-dire de buffer, nous devons le comparer avec le cache. La simple comparaison des définitions n'a aucun sens. Pourquoi ne pas regarder ce qu'elles font. La mise en cache résout le problème de la recherche et de l'utilisation rapides des données et économise la consommation du processeur, tandis que la mise en mémoire tampon résout le problème de l'inadéquation entre le processeur à haute vitesse et les périphériques d'E/S à faible vitesse.

Parlons de l'autre protagoniste de cet article, la fonction ob ob est l'abréviation de output_buffering. Puisque la fonction ob est une fonction d'extension PHP, l'opération principale de la fonction ob est tampon php.

Après avoir brièvement évoqué les deux protagonistes de cet article, il faut revenir au sujet de départ. Comment les données sorties par la fonction echo print_r parviennent-elles au navigateur pour que l'utilisateur les voie ? Le processus réel est le suivant :

Le code est le suivant :

echo、print_r=>php output_buffering=>webServer buffer=>browser buffer=>browser display

Nous pouvons clairement le voir depuis les fonctions echo et print_r jusqu'à l'envoi d'informations au client Deux tampons sont transmis et un tampon de navigateur est transmis côté client. Ce dont nous discutons principalement dans cet article est php output_buffering.

Utilisation du tampon lorsque la fonction ob n'est pas utilisée

Nos codes n'utilisent souvent pas du tout la fonction ob, alors utilisent-ils le tampon ? Cela dépend des paramètres php. Le tampon est contrôlé via la variable output_buffering dans php.ini. Sa valeur par défaut est off et peut être activée pour ouvrir le tampon. Après avoir appelé le tampon, même si la fonction ob n'est pas utilisée dans le programme, le code utilise effectivement le tampon. De plus, quel que soit le réglage de output_buffering dans php.ini, php en mode cli est toujours fermé par défaut.

Pourquoi c'est un tampon ? Pour faire simple, le processeur haute vitesse a traité ses propres données plus tôt et souhaite les transmettre à l'utilisateur via la ligne, mais la ligne est trop étroite et ne peut pas être transmise en une seule fois. Si un tampon est introduit, le processeur peut rapidement placer les données générées dans le tampon, puis les reposer dans un endroit frais. Le tampon produit les données en temps opportun selon les instructions. Cela résout efficacement la contradiction entre les processeurs à haute vitesse et les périphériques d'E/S à faible vitesse.

Quand les données du tampon seront-elles sorties ? 1. Lorsque le tampon est plein, le tampon a une capacité et le contenu sera automatiquement affiché lorsque la limite est atteinte. 2. L'exécution du script est terminée. De nombreux petits programmes ne génèrent pas autant de contenu. Vous ne pouvez pas attendre que le tampon soit plein avant de générer ~ C'est naturel.

 Utilisation du tampon lors de l'utilisation de la fonction ob

Le code est le suivant :

 ob_start()

Activez le tampon de sortie. Cette fonction est l’une des fonctions que nous appelons le plus. Avec output_buffering défini sur on ou x k, cette fonction n'ouvre pas tant le tampon de sortie qu'elle étend le tampon de sortie à une grande taille. Bien entendu, à condition que output_buffering soit désactivé, ob_start jouera le rôle d'ouverture du tampon. ob_start() peut également transmettre un paramètre facultatif à la fonction output_callback, qui est expliqué en détail dans le manuel officiel de PHP.

Le code est le suivant :

ob_get_contents

()

Récupérez simplement le contenu du tampon de sortie, mais ne l'effacez pas.

Le code est le suivant :

ob_end_clean()与ob_clean()

La différence entre ces deux fonctions peut être vue littéralement. Le premier efface le contenu du tampon et le ferme, tandis que le second effectue uniquement le travail de nettoyage. Il convient de noter qu'après avoir utilisé ces deux fonctions, les fonctions précédentes telles que echo et print_r ne généreront pas le contenu.

L'auteur a essayé une fois d'imprimer le contenu de ob_get_contents() via print_r, puis a appelé ob_clean() pour vider le tampon, afin de ne pas affecter les opérations ultérieures sur le tampon ont échoué à plusieurs reprises. Si vous y réfléchissez bien, le contenu de print_r est à nouveau écrit dans le tampon, puis l'opération ob_clean() est effectuée, donc naturellement il n'y aura aucune sortie. L'appel de la fonction ob_flush() avant l'opération ob_clean peut obtenir l'effet souhaité.

Le code est le suivant :

ob_flush()与flush()

 ob_flush() envoie le contenu du tampon et supprime le contenu. Par conséquent, il est préférable d'utiliser ob_get_contents() pour obtenir le contenu du tampon avant cette fonction. flush() vide le tampon côté serveur et l'envoie au client. Par conséquent, du point de vue du processus, ob_flush() doit être appelé en premier, puis la fonction flush.

De plus, laissez-moi vous expliquer le principe de fonctionnement de Apache buffer flush() : sous la sapi du module apache, le flush se fera en appelant sapi_module()Le pointeur de fonction membre flush utilise indirectement l'API::ap_rflush d'Apache pour actualiser le tampon de sortie d'Apache. Bien entendu, d'autres modules d'Apache tels que mod_gzip peuvent modifier le résultat de cette action et effectuer eux-mêmes le tampon de sortie, ce qui empêchera l'envoi des résultats générés par la fonction flush() au client. navigateur immédiatement.

Le code est le suivant :

ob_get_clean()

Si vous connaissez déjà ob_get_contents() et ob_clean(), alors cette fonction c'est très simple. Parce que c'est une combinaison des deux premiers. Il récupère principalement le contenu du tampon actuel et supprime le tampon de sortie actuel.

Il existe de nombreuses autres fonctions ob, mais la plupart d'entre elles sont relativement simples à utiliser et faciles à comprendre. Vous pouvez vous référer au manuel php, qui contiendra des explications détaillées. Cet article répertorie certaines fonctions que l'auteur n'a pas très bien compris au début. Bien sûr, de nouveaux problèmes surgiront à l'avenir. Penser aux problèmes et les résoudre peut être la joie de vivre ici.

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

Recommandations associées :

méthode php smtp pour implémenter la fonction d'envoi d'e-mails

php pour implémenter une fonction purement statique page Méthode

Comment implémenter le modèle observateur 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