Antworten:
Ausgabepufferung für Webentwickler, ein Leitfaden für Anfänger :
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.
ob_start()
, wird wirklich alles gepuffert. Es gibt einen optionalen zweiten Parameter für ob_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:
<?php
ob_start( );
phpinfo( );
$output = ob_get_clean( );
?>
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:
<?php
ob_start( );
echo "Hello World";
if ( $some_error )
{
header( "Location: error.php" );
exit( 0 );
}
?>
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.
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 Sie php.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 .
; 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 print or 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 Output Buffering Control
; functions.
; Possible Values:
; On = Enabled and buffer is unlimited. (Use with caution)
; Off = Disabled
; Integer = Enables the buffer and sets its maximum size in bytes.
; Note: This directive is hardcoded to Off for the CLI SAPI
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
; http://php.net/output-buffering
output_buffering = 4096
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.php
Beispiel: ob_get_clean ()
Unten sehen Sie, wie Sie eine erfassen echo
und 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.
http://php.net/manual/en/book.outcontrol.php
Mehr Ressourcen:
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
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.
Schön erklärt hier: https://phpfashion.com/everything-about-output-buffering-in-php
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 :)