Heim  >  Artikel  >  php教程  >  Detaillierte Erklärung des Unterschieds zwischen PHP Flush() und ob_flush()

Detaillierte Erklärung des Unterschieds zwischen PHP Flush() und ob_flush()

高洛峰
高洛峰Original
2016-12-22 16:29:031118Durchsuche

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 ü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 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 Konfigurationsdatei php.ini. Wenn Echo, Print usw. Benutzerdaten ausgeben, werden die Ausgabedaten in PHP Output_buffering geschrieben. Bis Output_buffering voll ist, werden die Daten über TCP an den Browser gesendet . zeigen. Sie können den PHP-Ausgabepuffermechanismus 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, da ob_start() den PHP-Pufferraum auf festlegt groß genug sein. Die Daten werden erst am Ende des Skripts oder beim Aufruf der ob_end_flush-Funktion an den Client-Browser gesendet.



Die Verwendung dieser beiden Funktionen ist für viele Menschen wahrscheinlich das verwirrendste Thema. Auch die Erklärung der beiden Funktionen im Handbuch ist unklar und ihre Unterschiede werden nicht klar hervorgehoben. Es scheint, dass die beiden Funktionen darin bestehen, den Ausgabecache zu aktualisieren. 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, wartet der vom Skript ausgegebene Inhalt auf die Ausgabe auf der Serverseite. Flush() kann den auf die Ausgabe wartenden Inhalt sofort an den Client senden.

Nachdem der Cache aktiviert wurde, wird der vom Skript ausgegebene Inhalt im Ausgabecache gespeichert. Zu diesem Zeitpunkt wartet kein Inhalt auf die Ausgabe. Wenn Sie „flush()“ direkt verwenden, wird kein Inhalt angezeigt an den Kunden gesendet. Die Funktion von ob_flush() besteht darin, den Inhalt, der ursprünglich im Ausgabecache vorhanden war, herauszunehmen und in den Warteausgabezustand zu versetzen, er wird jedoch nicht direkt an den Client gesendet. In diesem Fall müssen Sie ob_flush() verwenden. Zuerst und dann Flush(). Der Client Das Terminal kann 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 das Betriebssystem des Der Webserver ist ein Windows-System. Es gibt 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 aktualisiert werden.

Ausgabepufferungsfunktion
1.bool ob_start ([ callback $output_callback [, int $chunk_size [, bool $erase ]]] )
Aktivieren Sie den Output_buffering-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.

Mit ob_get_contents() können Sie die vom Server zwischengespeicherten Daten in Form einer Zeichenfolge abrufen.
Mit ob_end_flush() können Sie die zwischengespeicherten Daten ausgeben und den Cache schließen.
Mit ob_end_clean() werden die auf dem Server zwischengespeicherten Daten stillschweigend gelöscht, ohne dass Daten oder andere Aktionen erforderlich sind.
Die Caches auf der Serverseite sind gestapelt, was bedeutet, dass Sie nach der Aktivierung von ob_start() und vor dem Schließen auch einen weiteren Cache ob_start() darin aktivieren 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 zum Verarbeiten zwischengespeicherter Daten angeben. Wenn ein ob_start() in einem anderen ob_start() verschachtelt ist, gehen wir davon aus, dass der äußere ob_start() die Nummer A und der innere ob_start() die Nummer hat ist B. Sie haben jeweils eine Rückruffunktion, FunktionA und FunktionB. Wenn die Daten im Cache B ausgegeben werden, werden sie zuerst von der Rückruffunktion funcitonB verarbeitet und dann zur Verarbeitung an die äußere Rückruffunktion functionA übergeben 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 manuell in der Callback-Funktion zu ändern , mit Die chdir-Funktion scheint nicht oft anzutreffen. Denken Sie daran, das Handbuch zu lesen, 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 keine Ausgabe 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.
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. Sie müssen jedoch auch sicherstellen, dass es genauso viele Vorgänge zum Deaktivieren des Caches wie Vorgänge zum Aktivieren des Caches gibt.
ob_start() kann eine Rückruffunktion zum Verarbeiten zwischengespeicherter Daten angeben. Wenn ein ob_start() in einem anderen ob_start() verschachtelt ist, gehen wir davon aus, dass der äußere ob_start() die Nummer A und der innere ob_start() die Nummer hat ist B. Sie haben jeweils eine Rückruffunktion, FunktionA und FunktionB. Wenn die Daten im Cache B ausgegeben werden, werden sie zuerst von der Rückruffunktion von FunktionB verarbeitet und dann zur Verarbeitung an die äußere Rückruffunktion von FunktionA übergeben 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 manuell in der Callback-Funktion zu ändern , mit Die chdir-Funktion scheint nicht oft anzutreffen. Denken Sie daran, das Handbuch zu lesen, wenn Sie darauf stoßen.


Ausführlichere Erläuterungen zu den Unterschieden zwischen PHP Flush() und Ob_flush() finden Sie auf der chinesischen PHP-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