Ohne Ausgabepufferung (Standardeinstellung) wird Ihr HTML-Code in Teilen an den Browser gesendet, während PHP über Ihr Skript verarbeitet. Mit der Ausgabepufferung wird Ihr HTML-Code in einer Variablen gespeichert und am Ende Ihres Skripts als Teil an den Browser gesendet.
Vorteile der Ausgabepufferung für Webentwickler
Das Aktivieren der Ausgabepufferung allein verringert die Zeit, die zum Herunterladen und Rendern unseres HTML-Codes benötigt wird, da es nicht in Teilen an den Browser gesendet wird, während PHP den HTML-Code verarbeitet.
All das, was wir mit PHP-Strings machen können, können wir jetzt mit unserer gesamten HTML-Seite als eine Variable machen.
Wenn Sie beim Setzen von Cookies jemals auf die Meldung "Warnung: Header-Informationen können nicht geändert werden - Header können bereits von (Ausgabe) gesendet werden" gestoßen sind - werden Sie froh sein zu wissen, dass die Ausgabepufferung Ihre Antwort ist.
Ist wirklich alles bis zum Ende gepuffert, oder kommt die Seite nur in Stücken, wenn ich eine wirklich lange Seite habe?
Zedoo
5
@zedoo Wenn Sie mit der Ausgabepufferung beginnen ob_start(), wird wirklich alles gepuffert. Es gibt einen optionalen zweiten Parameter für ob_start(), int $chunk_sizeder, falls gesetzt, bewirkt, dass der Puffer nach jedem Ausgabeaufruf geleert wird, wodurch die Länge des Puffers dieser Größe entspricht oder diese überschreitet.
Axt.
12
Wenn die Meldung "Warnung: Header-Informationen können nicht geändert werden" angezeigt wird, müssen Sie zuerst Ihren Code prüfen, da das Aktivieren der Ausgabepufferung eine Behebung des Symptoms und nicht der Ursache darstellt. Etwas schreibt, bevor es an der Reihe ist. Ich bin also anderer Meinung, aber nicht genug, um die Antwort zu verfälschen.
Glenn Plas
5
Ich sehe nur die Vorteile der Pufferung. Warum ist sie in PHP nicht standardmäßig aktiviert?
Thomas Banderas
69
Die Ausgabepufferung wird von PHP verwendet, um die Leistung zu verbessern und einige Tricks auszuführen.
Sie können PHP die gesamte Ausgabe in einem Puffer speichern und auf einmal ausgeben lassen, um die Netzwerkleistung zu verbessern.
In bestimmten Situationen können Sie auf den Pufferinhalt zugreifen, ohne ihn an den Browser zurückzusenden.
Dieselbe Frage wie bei Axe: Startet die Ausgabepufferung nicht, ohne sie später wieder auszuschalten, sodass Ihr Skript auf alle möglichen Probleme stößt?
Edward Stumperd
1
Der Puffer wird geleert, wenn Sie eine der Leermethoden (z . B. ob_flush()oder ob_end_flush()) aufrufen . Der Inhalt des Puffers wird auch gelöscht, wenn Ihr Skript abrupt oder auf andere Weise endet, sodass kein Problem auftreten sollte.
Salman A
17
Ich weiß, dass dies eine alte Frage ist, aber ich wollte meine Antwort für visuelle Lernende schreiben. Ich konnte keine Diagramme finden, die die Ausgabepufferung im World Wide Web erklären, also habe ich selbst ein Diagramm in Windows erstellt mspaint.exe.
Wenn die Ausgabepufferung deaktiviert ist, echowerden die Daten sofort an den Browser gesendet.
Wenn die Ausgabepufferung aktiviert ist, echosendet a Daten an den Ausgabepuffer, bevor sie an den Browser gesendet werden.
phpinfo
Um zu sehen, ob die Ausgabepufferung ein- oder ausgeschaltet ist, lesen Sie bitte phpinfo im Kernabschnitt. Die output_bufferingAnweisung teilt Ihnen mit, ob die Ausgabepufferung ein- oder ausgeschaltet ist.
In diesem Fall ist der output_bufferingWert 4096, was bedeutet, dass die Puffergröße 4 KB beträgt. Dies bedeutet auch, dass die Ausgabepufferung auf dem Webserver aktiviert ist.
php.ini
Sie können die Puffergröße ein- und ausschalten und ändern, indem Sie den Wert der output_bufferingDirektive ändern . Finden Sie php.inies einfach in , ändern Sie es in die Einstellung Ihrer Wahl und starten Sie den Webserver neu. php.iniUnten finden Sie ein Beispiel von mir .
;Output buffering is a mechanism for controlling how much output data
;(excluding headers and cookies) PHP should keep internally before pushing that
; data to the client.If your application's output exceeds this setting, PHP
; will send that data in chunks of roughly the size you specify.
; Turning on this setting and managing its maximum buffer size can yield some
; interesting side-effects depending on your application and web server.
; You may be able to send headers and cookies after you've already sent output
; through printor echo.You also may see performance benefits if your server is; emitting less packets due to buffered output versus PHP streaming the output
;as it gets it.On production servers,4096 bytes is a good setting for performance
; reasons.;Note:Output buffering can also be controlled via OutputBufferingControl; functions.;PossibleValues:;On=Enabledand buffer is unlimited.(Usewith caution);Off=Disabled;Integer=Enables the buffer and sets its maximum size in bytes.;Note:This directive is hardcoded to Offfor the CLI SAPI
;DefaultValue:Off;DevelopmentValue:4096;ProductionValue:4096; http://php.net/output-buffering
output_buffering =4096
Die Direktive output_bufferingist nicht die einzige konfigurierbare Direktive bezüglich der Ausgabepufferung. Weitere konfigurierbare Ausgabepufferanweisungen finden Sie hier: http://php.net/manual/de/outcontrol.configuration.php
Beispiel: ob_get_clean ()
Unten sehen Sie, wie Sie eine erfassen echound bearbeiten, bevor Sie sie an den Browser senden.
// Turn on output buffering
ob_start();
echo 'Hello World';// save to output buffer
$output = ob_get_clean();// Get content from the output buffer, and discard the output buffer ...
$output = strtoupper($output);// manipulate the output
echo $output;// send to output stream / Browser// OUTPUT:
HELLO WORLD
Beispiele: Hackingwithphp.com
Weitere Informationen zum Ausgabepuffer mit Beispielen finden Sie hier:
Mit den Ausgabesteuerungsfunktionen können Sie steuern, wann die Ausgabe vom Skript gesendet wird. Dies kann in verschiedenen Situationen hilfreich sein, insbesondere wenn Sie Header an den Browser senden müssen, nachdem Ihr Skript mit der Datenausgabe begonnen hat. Die Ausgabesteuerungsfunktionen wirken sich nicht auf Header aus, die mit header () oder setcookie () gesendet werden, sondern nur auf Funktionen wie echo () und Daten zwischen PHP-Codeblöcken.
ob_start();// turns on output buffering
$foo->bar();// all output goes only to buffer
ob_clean();// delete the contents of the buffer, but remains buffering active
$foo->render();// output goes to buffer
ob_flush();// send buffer output
$none = ob_get_contents();// buffer content is now an empty string
ob_end_clean();// turn off output buffering
Puffer können verschachtelt sein. Während also ein Puffer aktiv ist, ob_start()aktiviert ein anderer einen neuen Puffer. Also ob_end_flush()und ob_flush()senden den Puffer nicht wirklich an die Ausgabe, sondern an den übergeordneten Puffer. Und nur wenn kein übergeordneter Puffer vorhanden ist, wird der Inhalt an den Browser oder das Terminal gesendet.
UPDATE 2019. Wenn Sie einen dedizierten Server und eine SSD oder besser NVM haben, 3,5 GHz. Sie sollten keine Pufferung verwenden, um eine schneller geladene Website in 100 bis 150 ms zu erstellen.
Weil das Netzwerk im Jahr 2019 mit Leistungsservern (Server, Speicher, Festplatte) und mit eingeschaltetem APC PHP langsamer ist als das Skript zu verarbeiten. Um ein generiertes Skript zu erstellen, benötigen Sie manchmal nur 70 ms. Ein anderes Mal benötigt nur das Netzwerk Zeit, von 10 ms bis zu 150 ms Benutzer-Server.
Wenn Sie also 150 ms schnell sein möchten, wird die Pufferung langsamer, da zusätzliche Erfassungspufferdaten zusätzliche Kosten verursachen. Vor 10 Jahren, als Server ein 1s-Skript erstellen, war es nützlich.
Bitte beachten Sie, dass output_buffering ein Limit hat, wenn Sie jpg zum Laden verwenden möchten, um das Senden zu automatisieren und das Senden zum Absturz zu bringen.
Prost.
Sie können schnell Fluss machen oder Sie können sicher tama machen :)
ob_start()
, wird wirklich alles gepuffert. Es gibt einen optionalen zweiten Parameter fürob_start()
,int $chunk_size
der, falls gesetzt, bewirkt, dass der Puffer nach jedem Ausgabeaufruf geleert wird, wodurch die Länge des Puffers dieser Größe entspricht oder diese überschreitet.Die Ausgabepufferung wird von PHP verwendet, um die Leistung zu verbessern und einige Tricks auszuführen.
Sie können PHP die gesamte Ausgabe in einem Puffer speichern und auf einmal ausgeben lassen, um die Netzwerkleistung zu verbessern.
In bestimmten Situationen können Sie auf den Pufferinhalt zugreifen, ohne ihn an den Browser zurückzusenden.
Betrachten Sie dieses Beispiel:
Das obige Beispiel erfasst die Ausgabe in einer Variablen, anstatt sie an den Browser zu senden. output_buffering ist standardmäßig deaktiviert.
Betrachten Sie dieses Beispiel:
quelle
ob_flush()
oderob_end_flush()
) aufrufen . Der Inhalt des Puffers wird auch gelöscht, wenn Ihr Skript abrupt oder auf andere Weise endet, sodass kein Problem auftreten sollte.Ich weiß, dass dies eine alte Frage ist, aber ich wollte meine Antwort für visuelle Lernende schreiben. Ich konnte keine Diagramme finden, die die Ausgabepufferung im World Wide Web erklären, also habe ich selbst ein Diagramm in Windows erstellt
mspaint.exe
.Wenn die Ausgabepufferung deaktiviert ist,
echo
werden die Daten sofort an den Browser gesendet.Wenn die Ausgabepufferung aktiviert ist,
echo
sendet a Daten an den Ausgabepuffer, bevor sie an den Browser gesendet werden.phpinfo
Um zu sehen, ob die Ausgabepufferung ein- oder ausgeschaltet ist, lesen Sie bitte phpinfo im Kernabschnitt. Die
output_buffering
Anweisung teilt Ihnen mit, ob die Ausgabepufferung ein- oder ausgeschaltet ist.In diesem Fall ist der
output_buffering
Wert 4096, was bedeutet, dass die Puffergröße 4 KB beträgt. Dies bedeutet auch, dass die Ausgabepufferung auf dem Webserver aktiviert ist.php.ini
Sie können die Puffergröße ein- und ausschalten und ändern, indem Sie den Wert der
output_buffering
Direktive ändern . Finden Siephp.ini
es einfach in , ändern Sie es in die Einstellung Ihrer Wahl und starten Sie den Webserver neu.php.ini
Unten finden Sie ein Beispiel von mir .Die Direktive
output_buffering
ist nicht die einzige konfigurierbare Direktive bezüglich der Ausgabepufferung. Weitere konfigurierbare Ausgabepufferanweisungen finden Sie hier: http://php.net/manual/de/outcontrol.configuration.phpBeispiel: ob_get_clean ()
Unten sehen Sie, wie Sie eine erfassen
echo
und bearbeiten, bevor Sie sie an den Browser senden.Beispiele: Hackingwithphp.com
Weitere Informationen zum Ausgabepuffer mit Beispielen finden Sie hier:
http://www.hackingwithphp.com/13/0/0/output-buffering
quelle
http://php.net/manual/en/book.outcontrol.php
Mehr Ressourcen:
Ausgabepufferung mit PHP
quelle
Wie der Name schon sagt, wird hier ein Speicherpuffer verwendet, mit dem verwaltet wird, wie die Ausgabe des Skripts angezeigt wird.
Hier ist ein sehr gutes Tutorial zum Thema
quelle
Puffer können verschachtelt sein. Während also ein Puffer aktiv ist,
ob_start()
aktiviert ein anderer einen neuen Puffer. Alsoob_end_flush()
undob_flush()
senden den Puffer nicht wirklich an die Ausgabe, sondern an den übergeordneten Puffer. Und nur wenn kein übergeordneter Puffer vorhanden ist, wird der Inhalt an den Browser oder das Terminal gesendet.Schön erklärt hier: https://phpfashion.com/everything-about-output-buffering-in-php
quelle
UPDATE 2019. Wenn Sie einen dedizierten Server und eine SSD oder besser NVM haben, 3,5 GHz. Sie sollten keine Pufferung verwenden, um eine schneller geladene Website in 100 bis 150 ms zu erstellen.
Weil das Netzwerk im Jahr 2019 mit Leistungsservern (Server, Speicher, Festplatte) und mit eingeschaltetem APC PHP langsamer ist als das Skript zu verarbeiten. Um ein generiertes Skript zu erstellen, benötigen Sie manchmal nur 70 ms. Ein anderes Mal benötigt nur das Netzwerk Zeit, von 10 ms bis zu 150 ms Benutzer-Server.
Wenn Sie also 150 ms schnell sein möchten, wird die Pufferung langsamer, da zusätzliche Erfassungspufferdaten zusätzliche Kosten verursachen. Vor 10 Jahren, als Server ein 1s-Skript erstellen, war es nützlich.
Bitte beachten Sie, dass output_buffering ein Limit hat, wenn Sie jpg zum Laden verwenden möchten, um das Senden zu automatisieren und das Senden zum Absturz zu bringen.
Prost.
Sie können schnell Fluss machen oder Sie können sicher tama machen :)
quelle