Was ist der Unterschied zwischen ob_flush()
und flush()
und warum muss ich beide anrufen?
Die ob_flush()
Referenz sagt:
Diese Funktion sendet den Inhalt des Ausgabepuffers (falls vorhanden).
Die flush()
Referenz sagt:
Leert die Schreibpuffer von PHP und dem von PHP verwendeten Backend (CGI, Webserver usw.).
Es heißt jedoch weiterhin:
[it] kann das Pufferungsschema Ihres Webservers möglicherweise nicht überschreiben.
Also, scheint mir, dass ich die ob_flush()
ganze Zeit nutzen könnte. Allerdings bekomme ich dabei seltsame Ergebnisse. Könnte jemand in einfachen Worten erklären, was hier los ist?
output_buffering
Konfigurationsoption, deren Standardwert in Produktionsversionen von php.ini 4096 ist. Das bedeutet, dass beim Starten eines PHP-Skripts die ersten 4096 Bytes der Ausgabe gepuffert werden (in einem Puffer, der mit gespült werden kannob_flush()
). Aus diesem Grunde ist es notwendig ist , zu verwenden ,ob_flush()
sowieflush()
. Durch Deaktivierenoutput_buffering
über php.ini oder Aufrufenob_end_clean()
oderob_end_flush()
zu Beginn des Skripts wird diese Notwendigkeit beseitigt.ob_end_clean()
am "Anfang des Skripts" scheint dies nicht intuitiv zu sein. Sie meinen, wir sollten dies bald nachob_start()
und vor den beiden Spülungen einbeziehen?ob_start()
und ein ganzob_end_clean()
am Anfang des Skripts. Nach jedem "Echo" während des Skripts füge ich auch hinzuob_flush(); flush();
, und ich gehe davon aus, dass während das Skript Zeit benötigt, alles, was bisher getan wurde, auf dem Bildschirm (im Browser) ausgegeben wird. Aber bis zum Ende wird nichts ausgegeben. Was vermisse ich?ob_flush
Leert die von Ihnen erstellten Ausgabepuffer mit einer Funktion wieob_start
flush
Leert die gepufferte Ausgabe des PHP-Skripts selbst an seinen Aufruferquelle
ob_flush()
ist eine High-Level-Spülung. Es löscht Puffer auf hoher Ebene und legt den gesamten Inhalt in den internen Puffern auf niedriger Ebene ab, die zum Senden bereit sind.ob_
Funktionsfamilie Stapel von Puffern erstellt.ob_flush()
Wenn Sie also überall blind schreiben , erhalten Sie in der Tat "seltsame Ergebnisse", wenn der Code geschrieben wurde, um diese Stapelung zu nutzen.flush()
ist ein Low-Level-Flush, der PHP anweist, seine internen Low-Level-Datenpuffer zu leeren.Darunter befinden sich noch Socket-Layer-Puffer. Darunter befinden sich Puffer auf Netzwerkebene. Und auf der untersten Ebene die Warteschlange der Elektronen, die das Datenkabel hinunterlaufen.
quelle
ob_start()
und ein ganzob_end_clean()
am Anfang des Skripts. Nach jedem "Echo" während des Skripts füge ich auch hinzuob_flush(); flush();
, und ich gehe davon aus, dass während das Skript Zeit benötigt, alles, was bisher getan wurde, auf dem Bildschirm (im Browser) ausgegeben wird. Aber bis zum Ende wird nichts ausgegeben. Was vermisse ich?Ich denke, das hängt mit Ihrer vorherigen Frage zusammen . Der wesentliche Vorteil der Verwendung der Ausgabepufferung besteht darin, dass sie neben der Datenkomprimierung verwendet wird. Wenn Sie nicht verwenden
ob_gzhandler
, gibt es wenig zu gewinnen.flush
Allein werden nur die noch auf dem Server befindlichen Ausgabedaten festgeschrieben. Mitob_start
und seine Kollegenob_flush
,ob_end_clean
undob_end_flush
, was auch immer wartet darauf , zu komprimiert werden (Blick aufflush
undob_flush
als die sich auf verschiedene Eimer -ob
sendet Daten anflush
,flush
sendet Daten an Browser - möglicherweise nicht richtig sein , aber das ist die Idee) wird verpackt und an den Client gesendet .quelle