Detaillierte Erläuterung des Nutzungsunterschieds zwischen den Funktionen „flush()' und „ob_flush()' in PHP

伊谢尔伦
Freigeben: 2023-03-11 10:04:02
Original
1264 Leute haben es durchsucht

1. 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( )

Standardmäßig ist der PHP-Puffer aktiviert und der Standardwert des Puffers ist 4096, also 1 KB. 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-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,
da ob_start() den PHP-Mechanismus festlegt Pufferspeicher auf eine ausreichend große Größe . Die Daten werden erst an den Client-Browser gesendet, wenn das Skript endet oder die Funktion
ob_end_flush
aufgerufen wird. 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.

3. 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 ] Allerdings kann der Ausgabepuffer auf Linux-Systemen nicht aktualisiert werden.

4. Ausgabepufferfunktion
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.
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.
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.

Aber Sie müssen auch sicherstellen, dass es genauso viele Vorgänge zum Ausschalten des Caches gibt wie Vorgänge zum Einschalten 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 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.

ob_end_flush und ob_end_clean
Die 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 serverseitig zwischengespeicherten Daten in Form einer Zeichenfolge abzurufen, und ob_end_flush() verwenden, um die zwischengespeicherten Daten auszugeben und den Cache zu 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 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.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Nutzungsunterschieds zwischen den Funktionen „flush()' und „ob_flush()' in PHP. 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