Heim  >  Artikel  >  Backend-Entwicklung  >  Zusammenfassung der PHP-Ausgabepuffersteuerung (Output Control).

Zusammenfassung der PHP-Ausgabepuffersteuerung (Output Control).

伊谢尔伦
伊谢尔伦Original
2016-11-25 13:38:511140Durchsuche

Einführung in die PHP-Pufferung

Eigentlich ist mein Eindruck von der PHP-OB-Serie noch sehr vage, ich weiß nicht viel darüber, wie man sie spielt, ich habe wirklich keine vertieftes Verständnis dieser 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 von Ausgaben wie Echo, Drucken. Die Ausgabe wird nicht sofort an den Webserver gesendet, sondern die Daten werden in den PHP-Puffer geschrieben. Der Vorteil des PHP-Output_Buffering-Mechanismus verbessert 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 Output_buffering-Konfiguration 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

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

header() muss vor jeder tatsächlichen Ausgabe aufgerufen werden, aber unser Programm hat bereits ausgegeben, läuft aber normal. Wenn Sie sich den folgenden Code ansehen:

<?php
echo "南无阿弥陀佛<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)
//真善忍好

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

ob_flush() und Flush()

Die Funktionen ob_flush() und Flush() sind im PHP-Handbuch detailliert beschrieben, Sie können sie nachlesen. Der Unterschied zwischen den beiden ist:

ob_flush() dient zum Aktualisieren des Puffers von PHP selbst.

flush() dient zum Aktualisieren des Puffers des WebServer-Servers. Ausgabe an den Browser. Es kommt jedoch zu folgender Situation:

Einzelne Webserverprogramme, insbesondere Webserverprogramme unter Win32, werden die Ausgabe des Skripts noch bis zum Ende des Programms zwischenspeichern, bevor sie die Ergebnisse an den Browser senden.

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.

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 f16b1740fad44fb09bfe928bcc527e08-Tag erhält.

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

Der obige Code wird Zeile für Zeile im Chrome-Browser ausgegeben, in den Browsern der IE-Serie jedoch alle. 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

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

end endet einfach, wie der Name schon sagt, schließt den Puffer, beide schließen den Ausgabepuffer, einer ist der Ausgabepuffer , der andere Es ist klar. 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);
}

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. Also 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);
}

加上flush(),就会一行一行输出。 如果把ob_end_clean 换成 ob_end_flush  会把 before 输出来。

其他函数 可参考手册,比较简单。

总结

php 脚本到浏览器,要经过  php buffer=》web server buffer=》browser buffer。 最后显示到浏览器。 缺一不可。 所以我们要 ob_flush 和  flush 以及加上  echo str_pad(”,4096) 才能调试出你想要的效果。


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