Was ist Ausgabepufferung?

201

Was ist Ausgabepufferung und warum wird sie in PHP verwendet?

Abhimanyu
quelle

Antworten:

274

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.
Axt.
quelle
6
+1. Hier ist ein weiterer hilfreicher Link: php.net/manual/en/function.ob-start.php - auch hilfreich, wenn es sich um eine Funktion handelt, die einen Wert wiedergibt , den Sie lieber in einer Variablen speichern möchten .
Cam
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.

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.

  • Sie können die Ausgabepufferung in Situationen verwenden, in denen Sie Header nach dem Senden von Inhalten ändern möchten.

Betrachten Sie dieses Beispiel:

<?php
    ob_start( );
    echo "Hello World";
    if ( $some_error )
    {
        header( "Location: error.php" );
        exit( 0 );
    }
?>
Salman A.
quelle
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.

Geben Sie hier die Bildbeschreibung ein

Wenn die Ausgabepufferung aktiviert ist, echosendet a Daten an den Ausgabepuffer, bevor sie an den Browser gesendet werden.

Geben Sie hier die Bildbeschreibung ein

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.

Geben Sie hier die Bildbeschreibung ein 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 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_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:

http://www.hackingwithphp.com/13/0/0/output-buffering

julianisch
quelle
9

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:

Ausgabepufferung mit PHP

Sarfraz
quelle
4

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

nik
quelle
1
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

Sudip
quelle
0

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 :)

Kamil Dąbrowski
quelle