Maison  >  Article  >  développement back-end  >  Explication détaillée de l'actualisation du tampon de sortie en PHP

Explication détaillée de l'actualisation du tampon de sortie en PHP

不言
不言original
2018-04-23 10:18:081609parcourir

Le contenu principal de cet article est une explication détaillée de l'actualisation du tampon de sortie en PHP. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

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), 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 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 la même manière, en PHP, lorsque echo et print sont exécutés, la sortie n'est pas immédiatement transmise au navigateur client pour affichage 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 l'ordre echo/pring -> php buffer -> tcp buffer -> navigateur


Il existe trois fonctions liées à l'actualisation de la mémoire tampon dans PHP Chacun :

1). flush
Actualiser le tampon du programme PHP, quelles que soient les circonstances dans lesquelles PHP est exécuté. Cette fonction envoie toutes les sorties du programme jusqu'à présent au navigateur de l'utilisateur. Mais cette fonction n’aura aucun impact sur le mode de mise en cache du serveur ou du navigateur client, ni sur la mise en cache de PHP lui-même.

2).ob_flush

Cette fonction génère le cache de PHP lui-même. La propre mise en cache de PHP est contrôlée par output_buffering dans php.ini. La fonction de ob_flush() est de retirer le contenu initialement stocké 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 d'abord utiliser ob_flush(). puis flush(), le client pour obtenir immédiatement la sortie du script.

Les deux configurations PHP liées au propre tampon de sortie de PHP sont :
Paramètre 1 : output_buffering : on/off ou entier. Lorsqu'il est activé, le contrôle du cache de sortie sera utilisé dans tous les scripts sans limiter la taille du cache. Lorsqu'il est défini sur un nombre entier, tel que output_buffering=4096, lorsque les données du cache atteignent 4096 octets, le cache sera automatiquement sorti et actualisé. La différence entre ce paramètre est la raison pour laquelle le code ci-dessus a des résultats d'exécution différents à des moments différents. Lorsque output_buffering est désactivé, toutes les sorties (écho) du script seront immédiatement envoyées au client. Lorsque le code ci-dessus est exécuté, un nombre sera généré toutes les secondes. Une fois output_buffering activé, le contenu de sortie sera d'abord mis en cache sur le serveur et ne sera envoyé au client qu'à la fin du script.
Paramètre 2 : implicit_flush : on/off. La définition sur ON signifie que lorsque le script est sorti, il est automatiquement envoyé immédiatement au client. Cela équivaut à ajouter automatiquement flush() après echo.


3).ob_implicit_flush

Cette fonction force l'envoi immédiat de la sortie au navigateur chaque fois qu'il y a une sortie. De cette façon, il n'est pas nécessaire d'utiliser flush() pour l'envoyer au navigateur après chaque sortie (écho).

Voici des exemples :




[php] voir en clair copier



  1. <?php  
    ob_end_clean();  
    echo str_pad(" ", 256);  
    for ($i=100; $i>0; $i--) {  
       echo $i, &#39;<br/>&#39;;  
       flush();  
       sleep(1);   
    }   
    ?>

Le code ci-dessus doit être séparé par une seconde Sortie $i une fois. Le but de l'echo str_pad(" ", 256) ci-dessus est qu'IE doit recevoir 256 octets avant de commencer à afficher. Le code ci-dessus peut également être écrit des deux manières suivantes.





[php] voir en clair copier



  1. <?php  
    echo str_pad(" ", 256);  
    for ($i=100; $i>0; $i--) {  
       echo $i, &#39;<br />&#39;;  
       ob_flush();  
       flush();  
       sleep(1);   
    }   
    ?>




[php] voir en clair copier



  1. <?php  
    ob_implicit_flush(true);  
    echo str_pad(" ", 256);  
    for ($i=100; $i>0; $i--) {  
       echo $i, &#39;<br />&#39;;  
       ob_flush();  
       sleep(1);   
    }   
    ?>


De plus, nous devons également noter que le tampon de rafraîchissement est non seulement affecté par les aspects ci-dessus, mais également par les éléments suivants :


1). Certains programmes de serveur web, notamment les programmes de serveur web sous Win32, mettront toujours en cache la sortie du script jusqu'à la fin du programme avant d'envoyer les résultats au navigateur. Certains modules Apache, tels que mod_gzip, peuvent effectuer eux-mêmes une mise en cache de sortie, ce qui empêchera les résultats générés par la fonction flush() d'être envoyés immédiatement au navigateur client. Même les navigateurs mettent 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 un saut de 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. Des espaces supplémentaires doivent donc être envoyés pour que ces navigateurs affichent le contenu de la page.

2). L'impact du mode d'installation de PHP. La méthode ci-dessus peut être utilisée directement lorsque PHP est installé en tant que module Apache. Si vous utilisez FastCgi, vous devez faire attention aux configurations suivantes :

a). Apache+Fcgid+PHP
FcgidOutputBufferSize 0 (la valeur par défaut est 65536)

Lors de la configuration Fcgid, définissez cette valeur sur 0 et le code ci-dessus peut obtenir l'effet souhaité lors de l'actualisation du tampon.

b).IIS+FastCgi+PHP

ResponseBufferLimit=0

Modifiez cet élément sous WINDOWSsystem32inetsrvfcgiext.ini.

c).nginx+php-fpm

fastcgi_buffers 8 4k;<span class="content" style="margin:0px;padding:0px;"> fastcgi_busy_buffers_size 4k<span class="block" style="margin:0px;padding:0px;"></span></span>fastcgi_buffer_size 4k;

        fastcgi_buffers 8 4k;<br>        fastcgi_busy_buffers_size 4k<br>

        gzip off;

相关推荐:

<a href="http://www.php.cn/php-weizijiaocheng-384170.html" target="_self">详解通过刷新PHP缓冲区为你的站点加速</a>

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