Detaillierte Erläuterung des Beispiels „output_buffering' basierend auf dem PHP-Ausgabecache

伊谢尔伦
Freigeben: 2023-03-11 10:22:01
Original
1342 Leute haben es durchsucht

Klären Sie zunächst die Ausgabereihenfolge von PHP

1. Aktivieren Sie den PHP-Ausgabecache: echo,print -> server buffering - > Browser-Pufferung -> Browser-Pufferung
2 ; Browseranzeige Klären Sie auch den Ausgabecache des Browsers: IE beträgt 256 Byte, Chrome und Firefox sind 1000 Byte. Erst wenn die Ausgabedaten diese Länge erreichen oder das Skript endet, gibt der Browser die Daten auf der Seite aus

Lassen Sie uns über verschiedene verwendete PHP-Einstellungen und APIs sprechen:
Ausgabepufferkonfiguration in 1.php.ini
•Aus: bedeutet, dass der PHP-Ausgabecache ausgeschaltet wird
•Ein: unendlich eingeschaltet Ausgabecache
•4096: Öffnen Sie den Ausgabecache mit einer Größe von 4096 Byte


Implicit_flush-Konfiguration in 2.php.ini
•Ein: Zeigt jede Ausgabe an (z. B. Echo). , print) und rufen Sie automatisch die Funktion „flush()“ auf und geben Sie diese direkt aus kann stattdessen die Funktion „flush( )“ verwenden, es spielt keine Rolle, ob sie nicht aktiviert ist, sie ist flexibler

3.
ob_flush
() Funktion: Nehmen Sie die heraus Daten in der PHP-Pufferung speichern und in die Server-Pufferung übertragen4.flush()-Funktion: Daten aus der Server-Pufferung herausnehmen und in die Browser-Pufferung übertragen


5.
ob_start
() Funktion: Ich weiß derzeit nicht viel über diese Funktion, da die Ausgabe nach dem Einschalten nicht von ob_flush() gesteuert wird. Auch wenn ob_flush(. ) und Flush() verwendet werden, können die Daten nicht sofort im Browser ausgegeben werden. Wenn Output_buffering=On verwendet wird, können die Ausgabedaten nicht zwischengespeichert werden Ausgabedaten können von PHP zwischengespeichert werden, auch wenn ob_start() nicht verwendet wird. Daher halte ich ob_start für relativ nutzlos und werde es daher vorerst ignorieren Dann schauen wir uns den Code an (set Output_buffering=4096, implicit_flush=Off)

Die Ausgabe des Codes erfolgt hier Zeile für Zeile. Schauen wir uns bitte die spezifischen Auswirkungen von ob_flush( an. ) und Flush()-Funktionen
<html>
     <body>
         <?php
             // ob_start();    //这玩意开了就会不正常,输出不受ob_flush()控制,不知道到底干嘛用
             // echo str_repeat(&#39; &#39; ,1000);    //IE缓存256Bytes
             echo str_repeat(&#39; &#39; ,1000);    //Chrome和FF缓存1000Bytes,这里用来先将浏览器缓存用掉,但是很疑惑这一行输出为什么没有被output_buffering存起来,而是直接输出了
             for($i=0;$i<5;$i++) {
                 echo $i.&#39;<br />&#39;;
                 ob_flush();
                 flush();
                 sleep(1);
             }
         ?>
     </body>
 </html>
Nach dem Login kopieren
Wenn eine dieser beiden Funktionen fehlt, muss ich unter meiner Einstellung warten, bis 0, 1, 2, 3 und 4 zwischengespeichert sind, und sie schließlich zusammen ausgeben

Endlich
Zitat
ein Absatz aus Laruences Blog, ich hoffe, er wird für das Verständnis aller hilfreich sein
Die Beschreibung von ob_flush/flush im Handbuch dient der Aktualisierung des Ausgabepuffers und muss auch in verwendet werden Konjunktion. Es wird also bei vielen Menschen Verwirrung stiften...

Tatsächlich wirken die beiden auf unterschiedliche Objekte.

Die ob_*-Funktionsreihe betreibt PHP selbst.

ob_flush dient also dazu, den PHP-eigenen Puffer zu aktualisieren.

Und Flush ist streng genommen nur in PHP als Apache verfügbar 🎜>Modul

( Handler oder Filter) wird installiert. Es dient dazu, den Puffer des Webservers zu aktualisieren (der sich speziell auf Apache bezieht).

Unter dem Sapi des Apache-Moduls leeren ruft das Flush-Mitglied von sapi_moduleFunktionszeiger auf und ruft indirekt die API von Apache auf: ap_rflush aktualisiert den Ausgabepuffer von Apache. Natürlich heißt es im Handbuch auch, dass es einige andere Module von Apache gibt, die das Ergebnis dieser Aktion ändern können ..

1 .Einige Apache-Module, wie z. B. mod_gzip, führen möglicherweise selbst ein Ausgabe-Caching durch,

2 Dies führt dazu, dass die von der Funktion „flush()“ generierten Ergebnisse nicht sofort an den Client-Browser gesendet werden. 3. 4. Sogar der Browser speichert den empfangenen Inhalt, bevor er ihn anzeigt. Beispiel: Netscape
5. Der Browser speichert den Inhalt, bis er eine neue Zeile oder den Anfang des HTML-Tags empfängt, und die gesamte Tabelle wird erst angezeigt, wenn er das empfängt. Etikett.
7.
8. Einige Versionen von Microsoft Internet Explorer beginnen erst mit der Anzeige von 256 Bytes
9, daher müssen einige zusätzliche Leerzeichen gesendet werden, um dies zu erreichen
10. Einige Browser zeigen es an Seiteninhalt.
Die richtige Reihenfolge für die Verwendung der beiden ist also: Zuerst ob_flush, dann Flush.

Natürlich können Sie unter anderen Sapi nicht Flush aufrufen, aber um die Portabilität Ihres Codes sicherzustellen, ist dies der Fall Empfohlen zur gemeinsamen Verwendung.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Beispiels „output_buffering' basierend auf dem PHP-Ausgabecache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!