wake-up-neo.com

Was ist die Verwendung von ob_start () in PHP?

Wird ob_start() für output buffering verwendet, damit die Header zwischengespeichert und nicht an den Browser gesendet werden? Bin ich hier sinnvoll? Wenn nicht, warum sollten wir ob_start() verwenden?

244
Aditya Shukla

Stellen Sie sich ob_start() so vor, als würden Sie sagen: "Fangen Sie an, sich an alles zu erinnern, was normalerweise ausgegeben würde, aber tun Sie es noch nicht."

Zum Beispiel:

ob_start();
echo("Hello there!"); //would normally get printed to the screen/output to browser
$output = ob_get_contents();
ob_end_clean();

Es gibt zwei weitere Funktionen, mit denen Sie normalerweise eine Verbindung herstellen: ob_get_contents(), mit der Sie alles, was "seit dem Einschalten mit ob_start()" im Puffer "gespeichert" wurde, und dann ob_end_clean() oder ob_flush(), wodurch entweder das Speichern von Daten gestoppt und das gespeicherte verworfen wird oder stoppt das Speichern und gibt sie alle auf einmal aus.

390
Riley Dutton

Ich benutze dies, um mit viel HTML aus PHP auszubrechen, es aber nicht zu rendern. Es erspart mir, es als String zu speichern, der die Farbkodierung von IDE deaktiviert.

<?php
ob_start();
?>
<div>
    <span>text</span>
    <a href="#">link</a>
</div>
<?php
$content = ob_get_clean();
?>

Anstatt:

<?php
$content = '<div>
    <span>text</span>
    <a href="#">link</a>
</div>';
?>
131
JD Isaacks

Die akzeptierte Antwort hier beschreibt, was ob_start() tut - nicht warum es verwendet wird (was war die Frage).

Wie bereits erwähnt, erstellt ob_start() einen Puffer, in den die Ausgabe geschrieben wird. 

Aber niemand hat erwähnt, dass es möglich ist, mehrere Puffer innerhalb von PHP zu stapeln. Siehe ob_get_level ().

Warum?.

  1. Das Senden von HTML an den Browser in größeren Abschnitten führt zu einem Leistungsvorteil bei einem geringeren Netzwerkaufwand.

  2. Das Weitergeben der Daten aus PHP in größeren Abschnitten führt zu einem Leistungs- und Kapazitätsvorteil, da die Anzahl der erforderlichen Kontextwechsel reduziert wird

  3. Das Übergeben größerer Datenblöcke an mod_gzip/mod_deflate bietet einen Leistungsvorteil, da die Komprimierung effizienter sein kann.

  4. durch die Pufferung der Ausgabe können Sie die HTTP-Header später noch im Code bearbeiten

  5. explizit flushing der Puffer nach der Ausgabe von [head] .... [/ head] kann dem Browser das Marshallen von anderen Ressourcen für die Seite vor dem Abschluss des HTML-Streams ermöglichen.

  6. Das Erfassen der Ausgabe in einem Puffer bedeutet, dass sie an andere Funktionen wie E-Mail weitergeleitet oder als zwischengespeicherte Darstellung des Inhalts in eine Datei kopiert werden kann

75
symcbean

Du hast es rückwärts. ob_start puffert die Header nicht, sondern den Inhalt. Mit ob_start können Sie den Inhalt in einem serverseitigen Puffer aufbewahren, bis Sie ihn anzeigen können.

Dies wird üblicherweise verwendet, damit Seiten Kopfzeilen senden können, nachdem sie bereits einige Inhalte gesendet haben (dh, sie entscheiden, die Hälfte der Wiedergabe einer Seite umzuleiten).

28
Craige

Ich bevorzuge:

ob_start();
echo("Hello there!");
$output = ob_get_clean(); //Get current buffer contents and delete current output buffer
11
hawx

dies soll weiter klären JD Isaaks Antwort ... 

Das Problem, auf das Sie häufig stoßen, ist, dass Sie PHP zur Ausgabe von HTML-Code aus vielen verschiedenen PHP-Quellen verwenden. Diese Quellen geben oft aus verschiedenen Gründen die Ausgabe auf unterschiedliche Weise aus. 

Manchmal haben Sie wörtliche HTML-Inhalte, die Sie direkt an den Browser ausgeben möchten. Zu anderen Zeitpunkten wird die Ausgabe dynamisch erstellt (serverseitig). 

Der dynamische Inhalt wird immer (?) Eine Zeichenfolge sein. Jetzt müssen Sie dieses stringifizierte dynamische HTML mit einem beliebigen direkt anzuzeigenden HTML-Code ... in einer einzigen sinnvollen HTML-Knotenstruktur kombinieren.

Dies zwingt den Entwickler normalerweise dazu, den gesamten Inhalt der Direktanzeige in eine Zeichenfolge zu packen (wie JD Isaak besprochen hatte), damit er in Verbindung mit dem dynamischen HTML-Code ordnungsgemäß bereitgestellt/eingefügt werden kann ... auch wenn Sie dies nicht wirklich tun will es eingewickelt haben. 

Mit den Methoden von ob _ ## können Sie jedoch den String-Wrapping-Fehler vermeiden. Der literale Inhalt wird stattdessen in den Puffer ausgegeben. Dann wird in einem einfachen Schritt der gesamte Inhalt des Puffers (alle Ihre wörtliche HTML-Datei) in Ihre Dynamic-HTML-Zeichenfolge verkettet. 

(Mein Beispiel zeigt die Ausgabe von Literal-HTML in den Puffer, der dann zu einem HTML-String hinzugefügt wird ... siehe auch das Beispiel von JD Isaaks, um den String-Wrapping-of-html zu sehen).

<?php // parent.php

//---------------------------------
$lvs_html  = "" ;

$lvs_html .= "<div>html</div>" ;
$lvs_html .= gf_component_assembler__without_ob( ) ;
$lvs_html .= "<div>more html</div>" ;

$lvs_html .= "----<br/>" ;

$lvs_html .= "<div>html</div>" ;
$lvs_html .= gf_component_assembler__with_ob( ) ;
$lvs_html .= "<div>more html</div>" ;

echo $lvs_html ;    
//    02 - component contents
//    html
//    01 - component header
//    03 - component footer
//    more html
//    ----
//    html
//    01 - component header
//    02 - component contents
//    03 - component footer
//    more html 

//---------------------------------
function gf_component_assembler__without_ob( ) 
  { 
    $lvs_html  = "<div>01 - component header</div>" ; // <table ><tr>" ;
    include( "component_contents.php" ) ;
    $lvs_html .= "<div>03 - component footer</div>" ; // </tr></table>" ;

    return $lvs_html ;
  } ;

//---------------------------------
function gf_component_assembler__with_ob( ) 
  { 
    $lvs_html  = "<div>01 - component header</div>" ; // <table ><tr>" ;

        ob_start();
        include( "component_contents.php" ) ;
    $lvs_html .= ob_get_clean();

    $lvs_html .= "<div>03 - component footer</div>" ; // </tr></table>" ;

    return $lvs_html ;
  } ;

//---------------------------------
?>

<!-- component_contents.php -->
  <div>
    02 - component contents
  </div>
7
dsdsdsdsd

Diese Funktion ist nicht nur für Header gedacht. Sie können damit eine Menge interessantes Zeug machen. Beispiel: Sie können Ihre Seite in Abschnitte aufteilen und wie folgt verwenden:

$someTemplate->selectSection('header');
echo 'This is the header.';

$someTemplate->selectSection('content');
echo 'This is some content.';

Sie können die hier generierte Ausgabe erfassen und an zwei völlig unterschiedlichen Stellen in Ihrem Layout hinzufügen.

3
jwueller

Folgende Punkte werden in den vorhandenen Antworten nicht erwähnt: Puffergröße Konfiguration HTTP-Header Und Verschachtelung. 

Konfiguration der Puffergröße für ob_start:

ob_start(null, 4096); // Once the buffer size exceeds 4096 bytes, PHP automatically executes flush, ie. the buffer is emptied and sent out.

Der obige Code verbessert die Serverleistung, da PHP größere Datenblöcke sendet, beispielsweise 4 KB (ohne ob_start-Aufruf, PHP sendet jedes Echo an den Browser). 

Wenn Sie mit der Pufferung ohne die Blockgröße beginnen (z. B. ein einfaches ob_start ()), wird die Seite am Ende des Skripts einmal gesendet.

Die Ausgabepufferung hat keine Auswirkungen auf die HTTP-Header, sie werden auf unterschiedliche Weise verarbeitet. Aufgrund der Pufferung können Sie die Header jedoch auch senden, nachdem die Ausgabe gesendet wurde, da sie sich noch im Puffer befindet.

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

Schön erklärt hier: https://phpfashion.com/everything-about-output-buffering-in-php

0
sudip

Nein, du liegst falsch, aber die Richtung passt;)

Der Ausgabepuffer puffert die Ausgabe eines Skripts. Das ist (kurz gesagt) nach echo oder print. Die Sache mit den Headern ist, dass sie nur gesendet werden können, wenn sie nicht bereits gesendet wurden. Aber HTTP sagt, dass Header die allererste Übertragung sind. Wenn Sie also zum ersten Mal (in einer Anfrage) etwas ausgeben, werden die Header gesendet und Sie können keine anderen Header setzen.

0
KingCrunch