uffer ---- 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), 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 entrez un caractère, le système d'exploitation n'écrira pas immédiatement le caractère directement sur le disque, mais l'écrira 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 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
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 les données utilisateur sont echo, print, etc., 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 ni au navigateur, car ob_start() définit l'espace tampon php sur être assez 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. Il semble que les deux fonctions soient d'actualiser 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 en attente de sortie côté serveur. flush() peut immédiatement envoyer le contenu en attente de sortie au client.
Une fois le cache activé, le contenu généré par le script est stocké dans le cache de sortie. À ce stade, aucun contenu n'est en attente de sortie. Si vous utilisez directement flush(), aucun contenu ne sera affiché. envoyé au client. La fonction de ob_flush() est de supprimer le contenu qui existait à l'origine dans le cache de sortie et de le mettre à l'état de sortie en attente, mais il ne sera pas envoyé directement au client. Dans ce cas, vous devez utiliser ob_flush(). d'abord, puis flush(). Le client Le terminal peut immédiatement obtenir la sortie du script.
1. L'ordre correct de flush et ob_flush, l'ordre correct est, ob_flush d'abord puis flush, comme suit :
ob_flush();
flush();
Si le système d'exploitation du le serveur web est un système Windows, il n'y aura aucun problème si l'ordre est inversé ou si ob_flush() n'est pas utilisé. [À vérifier] Mais 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 ]]] )
Activez le mécanisme de sortie_buffering. Une fois activée, la sortie du script n'est plus directement envoyée 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
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 ouvrir 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 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.
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 de 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.
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. 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 être. sortie 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.
Pour des explications plus détaillées sur les différences entre PHP flush() et ob_flush(), veuillez faire attention au site Web PHP chinois !