PHP comprend parfaitement l'utilisation de la fonction de tampon de rafraîchissement

伊谢尔伦
Libérer: 2023-03-11 10:18:01
original
3820 Les gens l'ont consulté

À propos de l'utilisation de ob_flush() et flush() en PHP

Remarque : les deux fonctions ob_flush() et flush() sont généralement utilisées ensemble, et la l'ordre est d'abord ob_flush(), puis flush(), leur fonction est de rafraîchir le tampon.
Voici une explication détaillée de quand utiliser le tampon d'actualisation et pourquoi actualiser le tampon.

1. Quand rafraîchir le tampon

Quand les deux fonctions file_get_contents() et file_put_contens() sont utilisées dans le programme, Ou quand en effectuant des fonctions de « lecture et écriture » similaires dans le programme ou en effectuant des opérations de sortie vers le navigateur, ob_flush() et flush() seront utilisés pour actualiser le tampon.

2. Pourquoi le tampon doit être actualisé

En utilisant file_get_contents() et file_put_content() comme exemples pour expliquer.

Les deux fonctions file_get_contents() et file_put_conents() effectuent respectivement des opérations de lecture et d'écriture de données. Les données sont d'abord lues dans la mémoire puis écrites dans le fichier, car la vitesse de lecture est plus rapide que la vitesse d'écriture ne devrait. Soyez rapide, donc lorsque vos données sont lues, cela ne signifie pas que les données ont été écrites à ce moment-là, plus le contenu lu sera temporairement placé dans le tampon (mémoire). la lecture et l'écriture de données sont deux actions très rapides.

Il y a aussi une explication (lorsque le programme effectue une opération de sortie vers le navigateur), les programmes de serveur Web individuels, en particulier les programmes de serveur Web sous Win32, mettront toujours en cache le script avant d'envoyer les résultats à la sortie du navigateur. jusqu'à la fin du programme. Si vous ne souhaitez pas que le programme soit affiché dans le navigateur seulement après son exécution, vous pouvez également utiliser ob_flush() et flush() pour actualiser le cache.

En fait, flush() a une autre utilisation, qui consiste à afficher avant la fin du programme, c'est-à-dire qu'une partie des résultats peut être affichée dans le navigateur avant la fin d'une boucle. effet de transmission ajax asynchrone.
Compréhension approfondie de la différence entre ob_flush et flush
La description de ob_flush/flush dans le manuel actualise le tampon de sortie et doit être utilisée conjointement, ce qui entraînera une confusion pour beaucoup de gens...
En fait, elles 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. rafraîchit PHP lui-même.
Et flush, à proprement parler, cela n'a d'effet réel que lorsque PHP est installé en tant que module (gestionnaire ou filtre) d'Apache. Il rafraîchit le tampon du serveur Web (qui peut être considéré comme spécifiquement Apache). .
Sous le module sapi d'apache, flush appellera indirectement l'api d'apache en appelant le membre flush
pointeur de fonction de sapi_module : ap_rflush rafraîchit le tampon de sortie d'apache. Bien sûr, le manuel le dit aussi. , Il existe d'autres modules d'Apache qui peuvent modifier le résultat de cette action. Certains modules d'Apache, tels que mod_gzip, peuvent effectuer eux-mêmes la mise en cache de sortie, ce qui entraînera la mise en cache des résultats générés par la fonction flush(). ne sera pas envoyé immédiatement au client final.
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 .
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 conséquent, l'ordre correct pour utiliser les deux est d'abord. , puis flush,
Bien sûr, sous d'autres sapi, vous ne pouvez pas appeler flush, mais pour assurer la portabilité de votre code, il est recommandé de l'utiliser ensemble.

buffer --- - flush()

Le tampon est un espace d'adressage mémoire. La taille par défaut du système Linux est généralement de 4096 (1 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.
De même, lorsque echo et print sont exécutés, la sortie n'est pas immédiatement transmise au navigateur client pour être affichée via TCP, mais les données sont écrites dans le tampon php. Le mécanisme php output_buffering signifie qu'une nouvelle file d'attente est établie avant le tampon TCP et que les données doivent passer par la file d'attente. Lorsqu'un tampon php est plein, le processus de script transmet les données de sortie du tampon php au noyau du système et les transmet au navigateur via TCP pour affichage. Par conséquent, les données seront écrites à ces endroits dans la séquence echo/pring -> php buffer -> tcp buffer -> browser
php output_buffering --- ob_flush()
Default Ensuite, le tampon php est activé et la valeur par défaut du tampon est 4096, soit 1 Ko. Vous pouvez trouver la configuration de output_buffering dans le fichier de configuration php.ini . Lorsque echo, print, etc. génèrent des données utilisateur, les données de sortie seront écrites dans php output_buffering jusqu'à ce que output_buffering soit plein, les données seront. Transmis au navigateur pour affichage via TCP. Vous pouvez également activer manuellement le mécanisme php output_buffering via ob_start(), de sorte que même si la sortie dépasse 1 Ko de données, les données ne sont pas réellement transmises à TCP et transmises au navigateur, car ob_start() le fera L'espace tampon est défini pour être suffisamment grand . Les données ne seront envoyées au navigateur client qu'à la fin du script ou avant l'appel de la fonction ob_end_flush.

L'utilisation de ces deux fonctions est probablement le problème le plus déroutant pour de nombreuses personnes. L'explication des deux fonctions dans le manuel n'est pas non plus claire, et leurs différences ne sont pas clairement soulignées. les fonctions des deux sont les mêmes : vider le cache de sortie. Mais dans le code au début de notre article, si flush() est remplacé par ob_flush(), le programme ne s'exécutera plus correctement. Évidemment, il y a une différence entre eux. Sinon, il suffirait d'indiquer directement dans le manuel que l'un d'eux est un alias d'une autre fonction. Il n'est pas nécessaire de les expliquer séparément. Alors, quelle est la différence entre eux ?
Lorsque la mise en cache n'est pas activée, le contenu généré par le script est dans l'état en attente de sortie côté serveur. flush() peut immédiatement envoyer le contenu en attente de sortie au client.

Une fois la mise en cache activée, le contenu généré par le script est stocké dans le cache de sortie À l'heure actuelle, aucun contenu n'attend la sortie si vous utilisez directement flush(). , il n'enverra aucun message au contenu du client. La fonction de ob_flush() est de retirer le contenu initialement stocké dans le cache de sortie et de définir sur l'état de sortie en attente, mais il ne sera pas envoyé directement au client Dans ce cas, vous en avez besoin. Pour utiliser ob_flush() d'abord, puis en utilisant flush(), le client peut immédiatement obtenir la sortie du script.

1. L'ordre correct de flush et ob_flush est, ob_flush d'abord puis flush, comme suit :
ob_flush();
flush();
Si le serveur Web Si le système d'exploitation est Windows, il n'y aura aucun problème si l'ordre est inversé ou si ob_flush() n'est pas utilisé. [À vérifier ] Cependant, le tampon de sortie ne peut pas être actualisé sur les systèmes Linux.
fonction de mise en mémoire tampon de sortie
1.bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
Activer le output_buffering mécanisme . Une fois activée, la sortie du script n'est plus envoyée directement au navigateur, mais est temporairement écrite dans la zone mémoire tampon PHP.
php active le mécanisme output_buffering par défaut, mais en appelant la fonction ob_start(), la valeur output_buffering des données est étendue à une valeur suffisamment grande. Vous pouvez également spécifier $chunk_size pour spécifier la valeur de output_buffering. La valeur par défaut de $chunk_size est 0, ce qui signifie que les données du tampon php ne seront envoyées au navigateur qu'à la fin du script. Si vous définissez la taille de $chunk_size, cela signifie que tant que la longueur des données dans le tampon atteint cette valeur, les données dans le tampon seront envoyées au navigateur.
Bien sûr, vous pouvez traiter les données dans le tampon en spécifiant $ouput_callback. Par exemple, la fonction ob_gzhandler compresse les données dans le tampon puis les envoie au navigateur.
Le troisième paramètre : s'il faut vider le cache, facultatif, la valeur par défaut est true, s'il est défini sur false, le cache ne sera pas vidé avant la fin de l'exécution du script.
2.ob_get_contents
Obtenez une copie des données dans le tampon php. Il convient de noter que vous devez appeler cette fonction avant l'appel de la fonction ob_end_clean(), sinon ob_get_contents() renvoie un caractère nul.
Vous pouvez utiliser ob_get_contents() pour obtenir les données mises en cache par le serveur sous la forme d'une chaîne
L'utilisation de ob_end_flush() affichera les données mises en cache et fermera le cache.
L'utilisation de ob_end_clean() effacera silencieusement les données mises en cache sur le serveur sans aucune donnée ni autre action.
Les caches côté serveur sont empilés, ce qui signifie qu'après avoir activé ob_start() et avant de le fermer, vous pouvez également activer un autre cache ob_start() à l'intérieur.
Mais vous devez aussi vous assurer qu'il y a autant d'opérations pour désactiver le cache qu'il y a d'opérations pour activer le cache.
ob_start() peut spécifier une fonction de rappel pour gérer les données du cache Si un ob_start() est imbriqué dans un autre ob_start(), nous supposons que l'extérieur. le nombre d'ob_start() de la couche est A et le numéro d'ob_start() de la couche interne est B. Ils ont chacun une fonction de rappel appelée functionA et functionB. Ensuite, lorsque les données du cache B sont sorties, elles seront traitées. par la fonction de rappel funcitonB, puis transmis à la fonction de rappel externe functionA pour le traitement, puis peut être envoyé au client.
De plus, le manuel indique que pour certains serveurs Web, comme Apache, l'utilisation de la fonction de rappel peut modifier le répertoire de travail actuel du programme. La solution consiste à modifier manuellement le répertoire de travail dans la fonction de rappel, à l'aide de la touche . fonction chdir. Cela ne semble pas être rencontré souvent, alors n'oubliez pas de consulter le manuel lorsque vous le rencontrez.
3. ob_end_flush et ob_end_clean
Ces deux fonctions sont quelque peu similaires, toutes deux désactivent le mécanisme ouptu_buffering. Mais la différence est que ob_end_flush vide uniquement (vide/envoie) les données du tampon php vers le navigateur client, tandis que ob_clean_clean efface (efface) les données dans le tampon php mais ne les envoie pas au navigateur client.
Avant l'appel de ob_end_flush, les données dans le tampon php existent toujours et ob_get_contents() peut toujours obtenir une copie des données dans le tampon php.

Après avoir appelé ob_end_flush(), ob_get_contents() obtient une chaîne vide et le navigateur ne peut pas recevoir la sortie, c'est-à-dire qu'il n'y a pas de sortie.

Vous pouvez utiliser ob_get_contents() pour obtenir les données mises en cache par le serveur sous la forme d'une chaîne. L'utilisation de ob_end_flush() affichera les données mises en cache et fermera le cache.
L'utilisation de ob_end_clean() effacera silencieusement les données mises en cache sur le serveur sans aucune donnée ni autre action.

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal