Detaillierte Erläuterung der PHP-Ausgabepuffersteuerung

墨辰丷
Freigeben: 2023-03-29 08:12:02
Original
1518 Leute haben es durchsucht

In diesem Artikel werden hauptsächlich detaillierte relevante Informationen und einfache Beispielcodes bereitgestellt, um Ihnen beim Lernen und Nachschlagen zu helfen.

Einführung in die PHP-Pufferung

Eigentlich ist mein Eindruck von der PHP-OB-Serie immer noch sehr vage, ich weiß nicht viel darüber, wie man sie spielt, ich habe wirklich kein tiefes Verständnis davon diese Inhalte. Als PHPer schäme ich mich sehr. Nach der Online-Suche und dem gegenseitigen Kopieren kann das vom Autor beschriebene Phänomen beim Ausführen des Codes nicht auftreten. Dieser Artikel ist ein gewissenhaftes Produkt und der Code wurde vom Autor ausgeführt.

Beim Ausführen einer Ausgabe, z. B. Echo, Drucken. Die Ausgabe wird nicht sofort an den Webserver gesendet, sondern die Daten werden in den PHP-Puffer geschrieben. Die Vorteile des PHP-Output_buffering-Mechanismus verbessern sicherlich die Leistung. Tatsächlich wird die PHP-Datei schließlich im Browser angezeigt und durchläuft drei Pufferstufen: PHP-Puffer=》Webserver-Puffer=》Browser-Puffer. Endlich im Browser angezeigt

Standardmäßig ist der PHP-Puffer aktiviert und der Standardwert des Puffers ist 4096, was 4 KB entspricht. Sie finden die Konfiguration „output_buffering“ in der Konfigurationsdatei php.ini. Puffer ist ein Speicheradressraum. Die Standardgröße des Linux-Systems beträgt im Allgemeinen 4096 (4 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.

Zum Beispiel muss

<?php
echo "南无阿弥陀佛<br>";
header("content-type:text/html;charset=&#39;utf-8&#39;");
echo "真善忍好!";
//output
//南无阿弥陀佛
//真善忍好
Nach dem Login kopieren

header() vor jeder tatsächlichen Ausgabe aufgerufen werden, aber wir Das Programm hat eine Ausgabe, läuft aber normal. Wenn Sie sich den folgenden Code ansehen:

<?phpecho "南无阿弥陀佛<br>";
ob_flush();
header("content-type:text/html;charset=&#39;utf-8&#39;");
echo "真善忍好!";
//output
//南无阿弥陀佛
//Cannot modify header information - headers already sent by (output started at E:\php\test.php:3)
//真善忍好
Nach dem Login kopieren

Das obige Programm zeigt, dass das Programm nicht sofort ausgibt, sondern nur den Puffer aktualisiert und ausgibt, wenn der ob_flush Funktion aufgerufen wird.

ob_flush() und Flush()

ob_flush() und Flush() sind in PHP verfügbar Benutzerhandbuch Detaillierte Anweisungen finden Sie hier. Der Unterschied zwischen den beiden ist:

ob_flush() dient zum Aktualisieren des PHP-eigenen Puffers.

flush() dient zum Aktualisieren des WebServer-Serverpuffers . Ausgabe an den Browser. Die folgende Situation tritt jedoch ein:

  1. Einige Webserverprogramme, insbesondere Webserverprogramme unter Win32, speichern die Ausgabe des Skripts immer noch zwischen, bevor sie die Ergebnisse an den Browser senden . , bis zum Ende des Programms.

  2. Einige Apache-Module, wie z. B. mod_gzip, können ihre eigene Ausgabe zwischenspeichern, was dazu führt, dass die von der Funktion „flush()“ generierten Ergebnisse nicht sofort an den Client-Browser gesendet werden.

  3. Sogar der Browser speichert den empfangenen Inhalt zwischen, bevor er ihn anzeigt. 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 -Tag erhält.

  4. Einige Versionen von Microsoft Internet Explorer beginnen erst mit der Anzeige der Seite, nachdem 256 Bytes empfangen wurden. Daher müssen einige zusätzliche Leerzeichen gesendet werden, damit diese Browser den Seiteninhalt anzeigen können.

Zum Beispiel:

<?php
/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo &#39;佛法无边&#39;."<BR>";
ob_flush();
flush();
sleep(1);
echo &#39;法轮常转&#39;;

//output
Nach dem Login kopieren

Der obige Code wird Zeile für Zeile im Chrome-Browser ausgegeben und auf dem Das heißt, der Browser gibt alle Serien aus. Tatsächlich handelt es sich um das vierte Element oben. Einige Browser beginnen mit der Anzeige erst, wenn sie 256 Zeichen empfangen. Ändern Sie den obigen Code in die folgende Form:

<?php
/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo str_pad(&#39;&#39;,240)."\n"; 
echo &#39;佛法无边&#39;."<BR>";
ob_flush();
flush();
sleep(1);
echo &#39;法轮常转&#39;;

//output
Nach dem Login kopieren

Auf diese Weise wird er zeilenweise im IE ausgegeben, da er 256 Zeichen überschreitet.

ob Andere Funktionsbeschreibungen

1.ob_end_flush und ob_end_clean

Ende endet, wie der Name schon sagt, schließt Die Pufferbereiche schalten beide den Ausgabepuffer aus, einer ist der Ausgabepuffer und der andere ist leer. Beispiel:

<?php
/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo &#39;before&#39;;
ob_end_clean();
echo str_pad(&#39;&#39;,4096)."\n";
for ($i=10; $i>0; $i--) 
{ 
 echo $i;
 sleep(1);
}
Nach dem Login kopieren

Der obige Code gibt den gesamten Inhalt auf einmal aus, anstatt ihn einzeln auszugeben. Schaltet ob_end_clean() den Puffer nicht aus? Warum nicht einzeln ausgeben? Tatsächlich wird PHP, wie oben erwähnt, nicht direkt an den Browser, sondern an den Webserver ausgegeben. Obwohl PHP keine Pufferung hat. Aber der Webserver existiert noch. Der folgende Code:

/**
Server:LightTPD/1.4.28 (Win32)
X-Powered-By:PHP/5.3.27
*/
echo &#39;before&#39;;
ob_end_clean();
echo str_pad(&#39;&#39;,4096)."\n";
for ($i=10; $i>0; $i--) 
{ 
 flush();
 echo $i;
 sleep(1);
}
Nach dem Login kopieren

plus Flush() gibt es Zeile für Zeile aus. Wenn Sie ob_end_clean durch ob_end_flush ersetzen, wird before ausgegeben.

Weitere Funktionen entnehmen Sie bitte dem Handbuch, das relativ einfach ist.

Zusammenfassung

Vom PHP-Skript zum Browser müssen Sie php buffer=》web server buffer=》browser buffer durchlaufen. Endlich im Browser angezeigt. Beides ist unverzichtbar. Wir benötigen also ob_flush und Flush und fügen echo str_pad('',4096) hinzu, um den gewünschten Effekt zu debuggen.

Zusammenfassung: Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein.

Verwandte Empfehlungen:

Anmelde-, Registrierungs- und Passwortänderungsfunktionen in PHP implementiert

Detaillierte Erläuterung der anonymen PHP-Funktionen und Vorsichtsmaßnahmen

Verwendung der Callback-Funktion call_user_func_array in PHP

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der PHP-Ausgabepuffersteuerung. 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