2010-12-09 9 views

Antwort

326

Denken Sie an ob_start() mit den Worten "Fangen Sie an, sich an alles zu erinnern, was normalerweise ausgegeben würde, aber tun Sie noch nichts damit."

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, die Sie normalerweise Paar es mit: ob_get_contents(), die Sie im Grunde gibt, was auch immer „gerettet“ zu dem Puffer wurde, da es mit ob_start() eingeschaltet wurde, und dann oder ob_flush(), die entweder aufhören zu speichern und verwirft alles, was gespeichert wurde, oder stoppt das Speichern und gibt es alle auf einmal.

+33

Große Erklärung. Ich würde einen Schritt weiter gehen und 'ob_get_contents()' durch 'ob_get_clean()' ersetzen und 'ob_end_clean()' entfernen, da 'ob_get_clean()' im Wesentlichen beide Funktionen ausführt. Referenz: http://php.net/manual/en/function.ob-get-clean.php (PHP 4> = 4.3.0, PHP 5) –

+0

Ich nehme an, Ausgangspufferung muss in der .ini-Datei Reihenfolge aktiviert werden 'ob_start(); 'zu rufen? Ist das korrekt? Was passiert, wenn es nicht aktiviert ist? –

+4

@Riley Dutton Sie sagen nicht, warum die ob_start() verwendet wird –

3

Diese Funktion ist nicht nur für Header. Sie können damit viele interessante Dinge tun. Beispiel: Sie könnten Ihre Seite in Abschnitte geteilt und es wie folgt verwendet werden:

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

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

Sie können die Ausgabe erfassen, die hier erzeugt wird, und es in zwei völlig verschiedenen Orten in Ihrem Layout hinzuzufügen.

+0

Diese Art von aussieht wie, was ich suche. Ich muss Sachen in 'Sektionen' rendern (denke an JS- und CSS-Dateien), aber ich muss sie innerhalb der Vorlage aufrufen können (die später als die Kopfzeile geladen wird) ... Also wenn ich "$ this" anrufe -> addcss ('specificCSStoThisView'); " Ich möchte, dass es zwischen den Tags rendert. Ich kann das jedoch nicht googeln. Könnten Sie mir vielleicht in die richtige Richtung zeigen? Vielen Dank! – NoobishPro

28

Sie haben es rückwärts. ob_start puffert die Header nicht, es puffert den Inhalt. Mithilfe von ob_start können Sie den Inhalt in einem serverseitigen Puffer aufbewahren, bis Sie ihn anzeigen können.

Dies wird häufig verwendet, damit Seiten Header senden können, nachdem sie bereits einige Inhalte gesendet haben (dh, sie entscheiden sich, die Hälfte des Renderings einer Seite umzuleiten).

+3

+1 Ich war auch hinsichtlich der tatsächlichen Verwendung der Funktion verwirrt. Ihre Antwort bezüglich der Verwendung während der "Weiterleitung" hat mich an alle Zeiten erinnert, in denen ich den Fehler "Header bereits gesendet" hatte.Danke – pat

0

Nein, Sie sind falsch, aber die Richtung passt;)

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

109

Ich benutze dies, damit ich PHP mit viel HTML ausbrechen kann, aber es nicht rendern. Es erspart mir, es als eine Zeichenfolge zu speichern, die Farbcodierung deaktiviert.

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

Statt:

<?php 
$content = '<div> 
    <span>text</span> 
    <a href="#">link</a> 
</div>'; 
?> 
+1

Kann dies als eine Möglichkeit verwendet werden, mehrere HTML-Seiten in einem PHP zu haben und sie über GET aufzurufen? – joshkrz

+0

Ich nehme an, aber es klingt nicht nach einer guten Idee. Es wäre besser, sie von separaten Vorlagen zu laden. –

+0

Beachten Sie, dass diese Technik ['ob_get_clean()'] (http://php.net/manual/en/function.ob-end-clean.php) verwendet, nicht ['ob_end_clean()'] (http: // php.net/manual/en/function.ob-end-clean.php) – Blazemonger

7

dies ist eine weitere Antwort JD Isaaks zu klären ...

Das Problem, das Sie in oft ausgeführt wird, dass Sie mit PHP ausgeben html aus vielen verschiedenen php-Quellen, und diese Quellen werden oft, aus welchen Gründen auch immer, über verschiedene Wege ausgegeben.

Manchmal haben Sie literalen HTML-Inhalt, den Sie direkt an den Browser ausgeben möchten; In anderen Fällen wird die Ausgabe dynamisch erstellt (serverseitig).

Der dynamische Inhalt wird immer (?) Eine Zeichenfolge sein. Jetzt müssen Sie diesen stringifizierten dynamischen HTML-Code mit jedem literalen HTML-Code in einer sinnvollen HTML-Knotenstruktur kombinieren.

Dies zwingt normalerweise den Entwickler, alle diese direkt zu Display Inhalt in eine Zeichenfolge zu wickeln (wie JD Isaak diskutierte), so dass es in Verbindung mit dem dynamischen HTML geliefert/eingefügt werden kann ... obwohl Sie Ich will es nicht wirklich verpackt haben.

Aber mit den Methoden ob _ ## können Sie diese Verwirrung vermeiden. Der wörtliche Inhalt wird stattdessen an den Puffer ausgegeben. Dann wird in einem einfachen Schritt der gesamte Inhalt des Puffers (all Ihr literales HTML) in Ihre Dynamic-HTML-Zeichenfolge verkettet.

(Mein Beispiel zeigt literal HTML in den Puffer ausgegeben wird, die dann zu einem HTML-String hinzugefügt wird ... siehe auch JD Isaaks Beispiel, um 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> 
58

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

Wie bereits an anderer Stelle erwähnt, erstellt ob_start() einen Puffer, in den der Ausgang geschrieben wird.

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

In Bezug auf das, warum ....

  1. Senden HTML an den Browser in größeren Brocken gibt einen Leistungsvorteil von einem reduzierten Netzwerk-Overhead.

  2. Passing die Daten aus PHP in größere Brocken durch die Reduzierung der Anzahl von Rahmen eines Leistungs- und Kapazitätsnutzen ergibt

  3. Passing größere Brocken von Daten benötigten Schalter mod_gzip/mod_deflate verursacht einen Leistungsvorteil, daß die Druck kann effizienter sein.

  4. die Ausgabe Pufferung bedeutet, dass Sie immer noch die HTTP-Header später im Code

  5. explizit Spülung der Puffer nach Ausgabe des [Kopf] manipulieren kann .... [/ head] können den Browser erlauben Zu beginnen Marshalling anderer Ressourcen für die Seite, bevor HTML-Stream abgeschlossen ist.

  6. die Ausgabe in einem Puffer Capturing bedeutet, dass es für andere Funktionen wie E-Mail, oder kopiert eine Datei als eine zwischengespeicherte Darstellung des Inhalts

7

Ich ziehe es umgeleitet werden:

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