Explication détaillée de la différence d'utilisation entre les fonctions flush() et ob_flush() en php

伊谢尔伦
Libérer: 2023-03-11 10:04:02
original
1264 Les gens l'ont consulté

1. buffer ---- flush()

buffer est un espace d'adressage mémoire. La taille par défaut du système Linux est généralement de 4096 (1 Ko), soit 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 envoyée 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 transmettra les données de sortie dans le tampon php au noyau du système et les transmettra 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


2. )
Par défaut, 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 envoyées au navigateur via TCP. . montrer. 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() définit le php espace tampon à une taille suffisamment grande . Les données ne seront pas envoyées au navigateur client tant que le script n'est pas terminé ou que la fonction ob_end_flush n'est pas appelée.

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.

3. 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.

4. Fonction de mise en mémoire tampon de sortie
bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
Activez le mécanisme output_buffering. 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.
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
Utilisez ob_end_flush() pour afficher les données mises en cache et fermer 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 également vous assurer que le nombre d'opérations pour désactiver le cache est le même que le nombre 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. , en utilisant La fonction chdir ne semble pas être rencontrée souvent. N'oubliez pas de consulter le manuel lorsque vous la rencontrez.

ob_end_flush et ob_end_clean
Les 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 côté serveur sous la forme d'une chaîne, et utiliser ob_end_flush() pour afficher les données mises en cache et fermer 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 ouvrir un autre cache ob_start() à l'intérieur. Cependant, vous devez également vous assurer qu'il existe autant d'opérations pour désactiver le cache que d'opérations pour activer le cache.
ob_start() peut spécifier une fonction de rappel pour traiter les données mises en cache. Si un ob_start() est imbriqué dans un autre ob_start(), nous supposons que l'ob_start() externe a le numéro A et le numéro interne ob_start() ). est B. Ils ont chacun une fonction de rappel, une fonction A et une fonction B. Ensuite, lorsque les données du cache B sont sorties, elles seront d'abord traitées par la fonction de rappel funcitonB, puis transmises à la fonction de rappel externe functionA pour traitement avant de pouvoir le faire. ê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. , en utilisant La fonction chdir ne semble pas être rencontrée souvent. N'oubliez pas de consulter le manuel lorsque vous la rencontrez.

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