Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erklärung zum Aktualisieren des Ausgabepuffers in PHP

Detaillierte Erklärung zum Aktualisieren des Ausgabepuffers in PHP

不言
不言Original
2018-04-23 10:18:081610Durchsuche

Der Hauptinhalt dieses Artikels ist eine detaillierte Erklärung zum Aktualisieren des Ausgabepuffers in PHP. Jetzt kann ich ihn mit Ihnen teilen.

Puffer ist ein Speicheradressraum. Die Standardgröße des Linux-Systems beträgt im Allgemeinen 4096 (1 KB), was einer Speicherseite entspricht. Es wird hauptsächlich zum Speichern von Datenübertragungsbereichen zwischen Geräten mit unsynchronisierten Geschwindigkeiten oder Geräten mit unterschiedlichen Prioritäten verwendet. Durch den Puffer können die Prozesse weniger aufeinander warten. Hier ist ein allgemeineres Beispiel. Wenn Sie einen Texteditor öffnen, um eine Datei zu bearbeiten, schreibt das Betriebssystem das Zeichen nicht sofort direkt auf die Festplatte, sondern schreibt es beim Schreiben zuerst in den Puffer Wenn ein Puffer voll ist, werden die Daten im Puffer auf die Festplatte geschrieben. Wenn die Kernelfunktion „flush()“ aufgerufen wird, müssen natürlich die fehlerhaften Daten im Puffer zurück auf die Festplatte geschrieben werden.

Auf die gleiche Weise wird in PHP bei der Ausführung von echo und print die Ausgabe nicht sofort zur Anzeige über TCP an den Client-Browser übertragen, sondern die Daten werden in den PHP-Puffer geschrieben. Der PHP-Output_Buffering-Mechanismus bedeutet, dass vor dem TCP-Puffer eine neue Warteschlange eingerichtet wird und Daten durch die Warteschlange geleitet werden müssen. Wenn ein PHP-Puffer voll ist, übergibt der Skriptprozess die Ausgabedaten im PHP-Puffer an den Systemkernel und leitet sie über TCP zur Anzeige an den Browser weiter. Daher werden die Daten nacheinander an diese Stellen geschrieben: echo/pring -> php buffer -> browser


Es gibt drei Funktionen im Zusammenhang mit der Aktualisierungspufferung PHP jeweils:

1). Aktualisieren Sie den Puffer des PHP-Programms, unabhängig von den Umständen, unter denen PHP ausgeführt wird. Diese Funktion sendet alle bisherigen Ausgaben des Programms an den Browser des Benutzers. Diese Funktion hat jedoch weder Auswirkungen auf den Caching-Modus des Server- oder Client-Browsers noch auf das Caching von PHP selbst.

2).ob_flush

Diese Funktion gibt den Cache von PHP selbst aus. PHPs eigenes Caching wird durch

output_buffering

in php.ini gesteuert. Die Funktion von ob_flush() besteht darin, den ursprünglich im Ausgabecache gespeicherten Inhalt herauszunehmen und in den Warteausgabezustand zu versetzen, er wird jedoch nicht direkt an den Client gesendet. In diesem Fall müssen Sie zuerst ob_flush() verwenden und dann „flush()“, damit der Client sofort die Ausgabe des Skripts erhält. Die beiden PHP-Konfigurationen im Zusammenhang mit der PHP-eigenen Ausgabepufferung sind:

Parameter 1:

output_buffering
: ein/aus oder ganzzahlig. Wenn diese Option aktiviert ist, wird die Ausgabe-Cache-Steuerung in allen Skripten verwendet, ohne dass die Größe des Caches begrenzt wird. Wenn es auf eine Ganzzahl eingestellt ist, z. B. „output_buffering=4096“, wird der Cache automatisch ausgegeben und aktualisiert, wenn die Cache-Daten 4096 Bytes erreichen. Der Unterschied in diesem Parameter ist der Grund, warum der obige Code zu unterschiedlichen Zeiten unterschiedliche Ausführungsergebnisse liefert. Wenn „output_buffering“ deaktiviert ist, werden alle Ausgaben (Echos) des Skripts sofort an den Client gesendet. Wenn der obige Code ausgeführt wird, wird jede Sekunde eine Zahl ausgegeben. Nachdem „output_buffering“ aktiviert wurde, wird der Ausgabeinhalt zunächst auf dem Server zwischengespeichert und erst am Ende des Skripts an den Client gesendet. Parameter 2: implicit_flush
: ein/aus. Die Einstellung „ON“ bedeutet, dass die Ausgabe des Skripts sofort automatisch an den Client gesendet wird. Dies entspricht dem automatischen Hinzufügen von „flush()“ nach dem Echo.

3).ob_implicit_flush
Diese Funktion erzwingt, dass die Ausgabe sofort an den Browser gesendet wird, wenn eine Ausgabe erfolgt. Auf diese Weise ist es nicht erforderlich, Flush() zu verwenden, um es nach jeder Ausgabe (Echo) an den Browser zu senden.

Das Folgende sind Beispiele:



[php]einfach anzeigenkopieren



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

Der obige Code sollte durch getrennt werden Eine Sekunde Geben Sie $i einmal aus. Der Zweck des obigen echo str_pad(" ", 256) besteht darin, dass der IE 256 Bytes empfangen muss, bevor er mit der Anzeige beginnt. Der obige Code kann auch auf die folgenden zwei Arten geschrieben werden.





[php]einfach anzeigenkopieren



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




[php]einfach anzeigenkopieren



  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);   
    }   
    ?>


Darüber hinaus müssen wir beachten, dass der Aktualisierungspuffer nicht nur von den oben genannten Aspekten, sondern auch von Folgendem beeinflusst wird:


1). Einige Webserver-Programme, insbesondere Webserver-Programme unter Win32, speichern die Ausgabe des Skripts noch bis zum Ende des Programms, bevor sie die Ergebnisse an den Browser senden. Einige Apache-Module, wie z. B. mod_gzip, führen möglicherweise selbst eine Zwischenspeicherung der Ausgabe durch, was dazu führt, dass die von der Funktion flush() generierten Ergebnisse nicht sofort an den Client-Browser gesendet werden. Sogar Browser speichern empfangene Inhalte zwischen, bevor sie diese anzeigen. Beispielsweise speichert der Netscape-Browser Inhalte zwischen, bis er einen Zeilenumbruch oder den Anfang eines HTML-Tags erhält, und zeigt die gesamte Tabelle erst an, wenn er ein f16b1740fad44fb09bfe928bcc527e08-Tag erhält. Einige Versionen von Microsoft Internet Explorer beginnen mit der Anzeige der Seite erst nach dem Empfang von 256 Bytes. Daher müssen einige zusätzliche Leerzeichen gesendet werden, damit diese Browser den Seiteninhalt anzeigen können.

2). Die Auswirkungen des PHP-Installationsmodus. Die obige Methode kann direkt verwendet werden, wenn PHP als Apache-Modul installiert ist. Wenn Sie FastCgi verwenden, müssen Sie auf die folgenden Konfigurationen achten:

a). Fcgid, Setzen Sie diesen Wert auf 0, und der obige Code kann beim Aktualisieren des Puffers den gewünschten Effekt erzielen.

b).IIS+FastCgi+PHP

ResponseBufferLimit=0

Ändern Sie dieses Element unter WINDOWSsystem32inetsrvfcgiext.ini.

c).nginx+php-fpm

fastcgi_buffers 8 4k;

fastcgi_busy_buffers_size 4k

fastcgi_buffer_size 4k;

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

         gzip off;

相关推荐:

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung zum Aktualisieren des Ausgabepuffers in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn