Maison > Article > développement back-end > Présentation de la méthode d'utilisation du cache php output_buffering
buffer est un espace d'adressage mémoire. La taille par défaut du système Linux est généralement de 4096 (4 Ko). 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.
Le tampon peut réduire l'attente entre les processus.
Par exemple, lorsque vous ouvrez un éditeur de texte et tapez un caractère, le système ne l'écrit pas immédiatement sur le disque. Au lieu de cela, il est stocké dans un tampon. Lorsqu'un tampon est plein, le contenu du tampon est écrit sur le disque.
Bien sûr, vous pouvez également utiliser flush pour forcer l'écriture des données du tampon sur le disque.
En php, comme echo, print, la sortie n'est pas immédiatement transmise à la sortie du navigateur via TCP. Au lieu de cela, les données sont écrites dans le tampon php. Lorsqu'un tampon php est plein, il sera transmis au navigateur via TCP.
echo /print -> php output_buffer -> tcp buffer -> navigateur
php output_buffering
Par défaut, le tampon php est activé et la valeur par défaut est 4096 (4 Ko). La configuration de output_buffering peut être trouvée dans php.ini. Il ne sera envoyé au navigateur que lorsque le tampon sera plein.
Vous pouvez également définir ob_start(), de sorte que même s'il dépasse la valeur par défaut (4 Ko), il ne sera pas envoyé immédiatement au navigateur. navigateur jusqu'à ce que le script soit terminé ou que la méthode ob_end_flush soit appelée Sortie vers le navigateur.
1.output_buffering=4096, génère moins de données (moins d'un tampon)
<?php for($i=0; $i<10; $i++){ echo $i.'<br>'; sleep(2); } ?>
Résultats en cours d'exécution : La sortie ne sera pas émise tant que tous les scripts ne seront pas terminés, car les données ne sont pas pleines d'une taille de tampon.
2.output_buffering=4096, afficher moins de données (moins d'un tampon), désactiver Output_buffering, modifier Output_buffering=0 dans php.ini
<?php for($i=0; $i<10; $i++){ echo $i.str_repeat(" ",500).'<br>'; // 当接受到的256(甚至更多)个字节以后才开始显示该页面,所以必须发送一些额外的空格来让这些浏览器显示页面内容。 flush(); sleep(1); } ?>
Résultats d'exécution : la mise en mémoire tampon php étant désactivée, il n'est pas nécessaire d'attendre que le script s'exécute avant de pouvoir être généré. Les données ne restent pas dans le tampon php, et vous pouvez voir une sortie intermittente. echo -> tcp buffer ->browser
3 Lorsque output_buffering=4096, génère des données plus volumineuses (plus d'un tampon), n'utilisez pas ob_start( )
<?php for($i=0; $i<10; $i++){ echo file_get_contents('f.txt').$i.'<br>'; sleep(1); } ?>
Résultat d'exécution : f.txt est un fichier de plus de 4 Ko. Parce qu'il est plus grand que la valeur par défaut du tampon, l'espace du tampon n'est pas suffisant. Chaque fois qu'un tampon est plein, il sera affiché, vous pourrez donc voir une sortie intermittente.
4. Lorsque output_buffering=4096, pour générer des données plus volumineuses (plus d'un tampon), utilisez ob_start()
<?php ob_start(); for($i=0; $i<10; $i++){ echo file_get_contents('f.txt').$i.'<br>'; sleep(1); } ?>
Résultats d'exécution : étant donné que ob_start() est utilisé, un espace suffisamment grand sera défini pour le tampon, il sera donc enregistré jusqu'à ce que le script soit exécuté, puis affiché.
Méthode Output_buffering
1.ob_start
Activer le Output_buffering mécanisme , une fois activé, le script n'est plus affiché directement dans le navigateur, mais est temporairement écrit dans la zone tampon PHP. Il n'est envoyé qu'une fois l'exécution du script terminée.
2.ob_get_contents
Récupérer les données dans la mise en mémoire tampon php Remarque : il doit être appelé avant ob_end_clean(), sinon vous n'obtiendrez que des caractères nuls.
3.ob_end_flush et ob_end_clean
ob_end_flush afficheront les données dans la mise en mémoire tampon php, mais ne les effaceront pas.
ob_end_clean ne sortira pas, il effacera uniquement les données dans la mémoire tampon php.
Remarque :
La description de ob_flush/flush dans le manuel est de rafraîchir le tampon de sortie, et elle doit également être utilisée conjointement, cela créera donc de la confusion pour beaucoup les gens...En fait, ils opèrent sur différents objets. Dans certains cas, flush ne fait rien du tout La série de fonctions ob_* exploite le tampon de sortie de PHP lui-même.Donc, ob_flush consiste à actualiser le propre tampon de PHP Et flush, à proprement parler, cela n'a d'effet réel que lorsque PHP est installé en tant que module Apache (gestionnaire ou filtre). (peut être considéré comme faisant spécifiquement référence à Apache) buffer. Sous le module sapi d'Apache, flush appellera indirectement l'API d'Apache en appelant le pointeur de fonction membre flush de sapi_module : ap_rflush actualise le tampon de sortie d'Apache, bien sûr, le tampon. Le manuel indique également qu'il existe d'autres modules d'Apache qui peuvent modifier le résultat de cette action.Certains modules Apache, tels que mod_gzip, peuvent effectuer eux-mêmes la mise en cache de sortie, ce qui entraînera la fonction flush() Les résultats produits ne sont pas immédiatement envoyés au navigateur client. 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 une nouvelle 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. 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.
Donc, l'ordre correct pour utiliser les deux est le suivant. Ob_flush d'abord, puis flush.
Bien sûr, sous d'autres sapi, il n'est pas nécessaire d'appeler flush. Cependant, afin d'assurer la portabilité de votre code, il est recommandé de l'utiliser ensemble.
Cet article explique comment utiliser le cache php output_buffering Pour plus de contenu connexe, veuillez faire attention au site Web chinois de php.
Recommandations associées :
Comment implémenter la sortie fragmentée BigPipe via php
Présentation du contenu associé au filtrage HTML php classe d'attribut de balise
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!