PHP ist mit der Verwendung der Aktualisierungspufferfunktion bestens vertraut

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

Informationen zur Verwendung von ob_flush() und Flush() in PHP

Hinweis: Die beiden Funktionen ob_flush() und Flush() werden im Allgemeinen zusammen verwendet Die Reihenfolge lautet: Zuerst ob_flush (), dann Flush (). Ihre Funktion besteht darin, den Puffer zu aktualisieren.
Hier finden Sie eine detaillierte Erklärung, wann der Aktualisierungspuffer verwendet werden sollte und warum der Puffer aktualisiert werden sollte.

1. Wann der Puffer aktualisiert werden soll

Wenn die beiden Funktionen file_get_contents() und file_put_contents() im Programm verwendet werden, oder wann Beim Ausführen ähnlicher „Lese- und Schreib“-Funktionen im Programm oder beim Ausführen von Ausgabevorgängen an den Browser werden ob_flush() und flush() zum Aktualisieren des Puffers verwendet.

2. Warum der Puffer aktualisiert werden sollte

Verwenden Sie file_get_contents() und file_put_content() als Beispiele zur Erklärung.

Die beiden Funktionen file_get_contents() und file_put_conents() führen jeweils Lese- und Schreibvorgänge durch. Die Daten werden zuerst in den Speicher eingelesen und dann in die Datei geschrieben, da die Lesegeschwindigkeit schneller ist als die Schreibgeschwindigkeit Es sollte schnell sein. Wenn Ihre Daten gelesen werden, bedeutet dies nicht, dass zu diesem Zeitpunkt mehr gelesene Inhalte vorübergehend im Puffer (Speicher) abgelegt werden. Dies muss tatsächlich hervorgehoben werden Das Lesen und Schreiben von Daten sind zwei sehr schnelle Vorgänge.

Es gibt auch eine Erklärung (wenn das Programm einen Ausgabevorgang an den Browser durchführt), dass einzelne Webserverprogramme, insbesondere Webserverprogramme unter Win32, das Skript immer noch zwischenspeichern, bevor sie die Ergebnisse an den Browser senden bis zum Ende des Programms. Wenn Sie nicht möchten, dass das Programm erst nach der Ausführung an den Browser ausgegeben wird, können Sie den Cache auch mit ob_flush() und Flush() aktualisieren.

Flush() hat tatsächlich eine andere Verwendung, nämlich die Ausgabe vor dem Ende des Programms. Das heißt, ein Teil der Ergebnisse kann vor dem Ende einer Schleife an den Browser ausgegeben werden Asynchroner Ajax-Übertragungseffekt.
Detailliertes Verständnis des Unterschieds zwischen ob_flush und Flush
Die Beschreibung von ob_flush/flush im Handbuch aktualisiert sowohl den Ausgabepuffer als auch muss in Verbindung verwendet werden, sodass es zu Verwirrung kommt für viele Leute...
Tatsächlich arbeiten sie mit verschiedenen Objekten
Die ob_*-Funktionsreihe betreibt den Ausgabepuffer von PHP selbst aktualisiert PHP selbst.
Und Flush hat genau genommen nur dann einen tatsächlichen Effekt, wenn PHP als Modul (Handler oder Filter) von Apache installiert ist. Es aktualisiert den Puffer von WebServer (was speziell als Apache betrachtet werden kann). .
Unter dem Sapi-Modul von Apache ruft Flush indirekt die API von Apache auf, indem es den Flush-Member
Funktionszeiger von sapi_module aufruft: ap_rflush aktualisiert den Ausgabepuffer von Apache. Natürlich heißt es auch , Es gibt einige andere Module von Apache, die das Ergebnis dieser Aktion ändern können Einige Module von Apache, 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 gesendet werden.
Sogar der Browser speichert den empfangenen Inhalt zwischen, bevor er ihn anzeigt. Beispielsweise speichert der Netscape-Browser Inhalte zwischen, bis er eine neue Zeile oder den Anfang eines HTML-Tags empfängt, und zeigt die gesamte Tabelle erst an, wenn er ein -Tag empfängt.
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. Daher ist die richtige Reihenfolge für die Verwendung der beiden , dann Flush,
Natürlich können Sie Flush unter anderen Sapi nicht aufrufen, aber um die Portabilität Ihres Codes sicherzustellen, wird empfohlen, ihn zusammen zu verwenden.

Puffer --- - Flush()

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.
In ähnlicher Weise wird bei der Ausführung von echo und print die Ausgabe nicht sofort zur Anzeige über TCP an den Client-Browser gesendet, 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 in der Reihenfolge echo/pring -> php buffer -> php output_buffering --- ob_flush() geschrieben Als nächstes wird der PHP-Puffer aktiviert und der Standardwert des Puffers ist 4096, was 1 KB entspricht. Sie finden die Output_buffering-Konfiguration in der php.ini
-Konfigurationsdatei . Wenn Echo, Druck usw. Benutzerdaten ausgeben, werden die Ausgabedaten in PHP Output_buffering geschrieben, bis die Daten voll sind Wird per TCP zur Anzeige an den Browser übermittelt. Sie können den PHP-Output_Buffering-Mechanismus auch manuell über ob_start() aktivieren, sodass die Daten, selbst wenn die Ausgabe 1 KB an Daten überschreitet, nicht tatsächlich an TCP übergeben und an den Browser übergeben werden, weil ob_start() dies tut Der Pufferplatz ist groß genug eingestellt
. Die Daten werden erst am Ende des Skripts oder beim Aufruf der Funktion ob_end_flush an den Client-Browser gesendet. Die Verwendung dieser beiden Funktionen ist für viele Menschen wahrscheinlich das verwirrendste Thema. Die Erklärung der beiden Funktionen im Handbuch ist ebenfalls unklar und ihre Unterschiede werden anscheinend nicht klar dargelegt Die Funktionen beider sind die gleichen: den Ausgabecache zu leeren. Wenn jedoch im Code am Anfang unseres Artikels „flush()“ durch „ob_flush()“ ersetzt wird, wird das Programm nicht mehr korrekt ausgeführt. Offensichtlich gibt es einen Unterschied zwischen ihnen. Andernfalls würde es ausreichen, im Handbuch direkt anzugeben, dass es sich bei einer davon um einen Alias ​​​​einer anderen Funktion handelt. Was ist also der Unterschied zwischen ihnen? Wenn das Caching nicht aktiviert ist, befindet sich der vom Skript ausgegebene Inhalt im Status
Warten auf Ausgabe

auf der Serverseite. Flush() kann den auf Ausgabe wartenden Inhalt sofort an den Client senden.


Nachdem das Caching aktiviert ist, wird der vom Skript ausgegebene Inhalt im Ausgabecache gespeichert Zu diesem Zeitpunkt wartet kein Inhalt auf die Ausgabe, wenn Sie „flush()“ verwenden , wird keine Nachricht an den Client gesendet. Die Funktion von ob_flush() besteht darin, den ursprünglich im Ausgabecache gespeicherten Inhalt zu entnehmen und

in den Warteausgabezustand zu versetzen, er wird jedoch nicht direkt an den Client

gesendet Um zuerst ob_flush() zu verwenden und dann Flush() zu verwenden, kann der Client sofort die Ausgabe des Skripts erhalten.

1. Die richtige Reihenfolge von Flush und ob_flush ist, ob_flush zuerst und dann Flush, wie folgt:
ob_flush();
flush();
Wenn der Webserver Wenn das Betriebssystem Windows ist, gibt es kein Problem, wenn die Reihenfolge umgekehrt wird oder wenn ob_flush() nicht verwendet wird. [Zu überprüfen ] Der Ausgabepuffer kann jedoch auf Linux-Systemen nicht geleert werden.
Ausgabepufferfunktion
1.bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
Aktivieren Sie die Ausgabepufferung Mechanismus. Nach der Aktivierung wird die Skriptausgabe nicht mehr direkt an den Browser gesendet, sondern vorübergehend in den PHP-Pufferspeicherbereich geschrieben.
php aktiviert standardmäßig den Output_buffering-Mechanismus, aber durch Aufrufen der ob_start()-Funktion wird der Datenoutput_buffering-Wert auf einen ausreichend großen Wert erweitert. Sie können auch $chunk_size angeben, um den Wert von „output_buffering“ festzulegen. Der Standardwert von $chunk_size ist 0, was bedeutet, dass die Daten im PHP-Puffer erst am Ende des Skripts an den Browser gesendet werden. Wenn Sie die Größe von $chunk_size festlegen, bedeutet dies, dass die Daten im Puffer an den Browser gesendet werden, solange die Datenlänge im Puffer diesen Wert erreicht.
Natürlich können Sie die Daten im Puffer verarbeiten, indem Sie $ouput_callback angeben. Beispielsweise komprimiert die Funktion ob_gzhandler die Daten im Puffer und sendet sie dann an den Browser.
Der dritte Parameter: ob der Cache geleert werden soll, optional, der Standardwert ist true. Wenn er auf false gesetzt ist, wird der Cache nicht geleert, bevor die Skriptausführung endet.
2.ob_get_contents
Erhalten Sie eine Kopie der Daten im PHP-Puffer. Es ist zu beachten, dass Sie diese Funktion aufrufen sollten, bevor die Funktion ob_end_clean() aufgerufen wird, da ob_get_contents() andernfalls ein Nullzeichen zurückgibt.
Sie können ob_get_contents() verwenden, um die vom Server zwischengespeicherten Daten in Form einer Zeichenfolge abzurufen.
Mit ob_end_flush() werden die zwischengespeicherten Daten ausgegeben und der Cache geschlossen.
Mit ob_end_clean() werden die auf dem Server zwischengespeicherten Daten stillschweigend gelöscht, ohne dass Daten oder andere Aktionen erforderlich sind.
Die serverseitigen Caches sind gestapelt, was bedeutet, dass Sie nach der Aktivierung von ob_start() und vor dem Schließen einen weiteren Cache ob_start() darin öffnen können.
Aber Sie müssen auch sicherstellen, dass es genauso viele Vorgänge zum Deaktivieren des Caches gibt wie Vorgänge zum Aktivieren des Caches.
ob_start() kann eine Rückruffunktion zur Verarbeitung von Cache-Daten angeben. Wenn ein ob_start() in einem anderen ob_start() verschachtelt ist, gehen wir davon aus, dass der äußere Die Nummer von ob_start() der Ebene ist A und die Nummer von ob_start() der inneren Ebene ist B. Sie haben jeweils eine Rückruffunktion namens functionA und functionB. Wenn die Daten im Cache B ausgegeben werden, werden sie verarbeitet von der FunktionB-Rückruffunktion und dann zur Verarbeitung an die äußere FunktionA-Rückruffunktion übergeben und dann an den Client ausgegeben werden.
Darüber hinaus heißt es im Handbuch, dass bei einigen Webservern, wie z. B. Apache, die Verwendung der Callback-Funktion das aktuelle Arbeitsverzeichnis des Programms ändern kann. Die Lösung besteht darin, das Arbeitsverzeichnis mithilfe der Callback-Funktion manuell wieder zu ändern chdir-Funktion scheint nicht oft anzutreffen, schauen Sie also im Handbuch nach, wenn Sie darauf stoßen.
3. ob_end_flush und ob_end_clean
Diese beiden Funktionen sind etwas ähnlich, beide schalten den ouptu_buffering-Mechanismus aus. Der Unterschied besteht jedoch darin, dass ob_end_flush nur die Daten im PHP-Puffer an den Client-Browser leert (flush/sendet), während ob_clean_clean die Daten im PHP-Puffer löscht (löscht), sie aber nicht an den Client-Browser sendet.
Bevor ob_end_flush aufgerufen wird, sind die Daten im PHP-Puffer noch vorhanden und ob_get_contents() kann weiterhin eine Kopie der Daten im PHP-Puffer abrufen.

Nach dem Aufruf von ob_end_flush() erhält ob_get_contents() eine leere Zeichenfolge und der Browser kann die Ausgabe nicht empfangen, dh es erfolgt keine Ausgabe.

Sie können ob_get_contents() verwenden, um die vom Server zwischengespeicherten Daten in Form einer Zeichenfolge abzurufen. Mit ob_end_flush() werden die zwischengespeicherten Daten ausgegeben und der Cache geschlossen.
Durch die Verwendung von ob_end_clean() werden die auf dem Server zwischengespeicherten Daten stillschweigend gelöscht, ohne dass Daten oder andere Aktionen erforderlich sind.

Das obige ist der detaillierte Inhalt vonPHP ist mit der Verwendung der Aktualisierungspufferfunktion bestens vertraut. 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