2016-04-24 4 views
1

Hauptsächlich in WordPress-Kontexten arbeitend, habe ich meistens auf Ausgabepufferung in meinem PHP-Code verzichtet, aber ich habe vor kurzem begonnen, damit zu experimentieren und einfach als Benutzer zu erkennen, ob es merkliche Leistungseinbußen in typischen (für mich) gab Szenarien. Ich kann nicht sagen, dass ich etwas Definitives erreicht habe, aber ich weiß nicht, dass meine Experimente wirklich auf groß angelegte Situationen zutreffen.PHP-Ausgang Pufferung: Wann/ob für verschiedene Arten von realen bestehenden Websites und Anwendungen zu verwenden?

Mein allgemeiner Eindruck ist, dass ich es vermeiden sollte, es sei denn, ich habe einen sehr guten Grund, es zu benutzen - wahrscheinlich mit der Art von Skript, an dem ich im Allgemeinen nicht interessiert bin. Aber ich lese Vorschläge, die ich in dem einen oder anderen normalen Kontext Pufferung verwenden könnte (zB ein Shortcode, der einen großen HTML-Block rendert), und ich sehe ihn oft im Code von Leuten, deren Arbeit ich bewundere und versuche nachzuahmen . Ich habe die bekannten Sequenzen von ob_start() usw. gesehen, die für das Rendern von sehr minimaler Ausgabe verwendet werden, die nicht weiter angepasst wird: zum Beispiel ein Menü oder eine andere kurze Liste.

Ich habe auch Leute gesehen, die behaupten, dass es einfach keine Notwendigkeit für die Ausgabepufferung in gut geschriebenem Code gibt, außer in besonderen Situationen. Siehe StackOverflow Q & A's hier Why use output buffering in PHP?, um ein Beispiel zu geben. Andere werden sagen, dass es NUR nützlich ist, wenn eine Manipulation der Ausgabe notwendig ist - wie ein preg_replace des Inhalts - aber Sie brauchen keinen Ausgabepuffer, um so etwas zu tun (irgendeine ol Variable reicht aus).

In den meisten realen Instanzen der Art, auf die ich stoße, wird auch eine Version des Seiten-Caching verwendet, und manchmal mehrere verschiedene Plug-Ins mit jeweils eigenem Caching. Wenn man bedenkt, wie viele Funktionen selbst zahlreiche verschachtelte/sekundäre HTML-erzeugende Funktionen verwenden, könnten Sie leicht Tausende von verschachtelten gepufferten Blöcken pro Seite erzeugen: Angenommen, eine foreach-Schleife erzeugt n Anzahl von Blog-Kommentaren innerhalb einer größeren Seite: Jeder Blog-Kommentar ist von einer Funktion gerendert und könnte getrennt gepuffert werden. Die Funktion für jeden Kommentar könnte innerhalb der foreach-Schleife der Funktion aufgerufen werden, die den Kommentarthread ausgibt, und ihre Ausgabe könnte auch gepuffert werden. Dann könnte die Funktion, die den Post, der den Kommentarthread enthält, ausgibt, gepuffert werden, bevor sie gerendert wird. Die gesamte Seite, einschließlich verschiedener selbstausgabebufferter Vorlagen, Plug-Ins, Widgets, Menüs usw., könnte ebenfalls ausgegeben gepuffert werden.

An welchem ​​Punkt wäre etwas davon nützlich oder, alternativ, völlig kontraproduktiv?

Wenn die Antwort jedes Element beinhaltet von "nun, Sie würden nicht in Ihrem Blog bemerken, aber Sie würden es für BuzzFeed oder die New York Times benötigen", oder umgekehrt, wie würde ich schätzen, wenn der Punkt hat erreicht worden?

An diesem Punkt möchte ich den Code so sauber wie möglich schreiben, und lassen (was ich verstehe) integrierte PHP, Browser, Server, etc., Pufferung und explizite Caching-Funktionen machen die Arbeit dass die Seite oder ihre Elemente effizient und schnell geladen werden, was das eigentliche Ziel ist, nein?

+0

@RyanVincent Es ist eine gute Übung, nur einen PHP-Block pro Datei zu verwenden und das abschließende '?>' Ganz wegzulassen, um unbeabsichtigtes Ausgeben zu verhindern. –

Antwort

0

Bei der Verwendung von Vorlagen-Engines wird der Code normalerweise nur einmal ausgegeben, nachdem der gesamte Seitencode generiert wurde. Daher ist für diesen Fall in der Regel keine Pufferung der Ausgabe erforderlich.

Die einzige Situation, in der die Pufferung der Ausgabe wirklich unvermeidbar ist, ist die Erfassung der Ausgabe von Funktionen wie var_dump() oder phpinfo(), ohne sie an den Browser zu senden. Dies kann auch für Bibliotheken von Drittanbietern nützlich sein, die echo verwenden, ohne die Möglichkeit zu bieten, das Ergebnis direkt als Zeichenfolge abzurufen.

+0

... welcher Kreisverkehr scheint zu implizieren, dass die Programmierer, die Ausgabepuffer verwenden, ein Menü oder eine Ergebnistabelle rendern (und ihren Code mit etwas wie "wir geben hier viel HTML aus, also lasst es puffern" kommentieren)) drehen gerade ihre Räder? –

+0

@CKMacLeod Ich habe keine Ahnung, warum manche Leute etwas ausgeben würden, anstatt es als String zurückzugeben, besonders für Bibliotheken. Vielleicht stammen sie aus der Zeit, als PHP selbst als Templat-Engine galt, wer weiß. Um mehrere Codefragmente zu akkumulieren, reicht 'array' /' implode() 'Ansatz aus. –

0

Ich poste dies als Antwort auf meine eigene Frage, allerdings nicht unter der Annahme, dass es keine besseren gibt, da ich auf einen Umstand gestoßen bin, der für eine bestimmte Art von Plug- in, einschließlich eines Typs, an dem ich eigentlich interessiert bin. Die Antwort bezieht sich hauptsächlich auf WordPress und Plug-Ins erweiterbar.

Kurz gesagt, um einen Filter zur Verfügung zu stellen - mit der üblichen WordPress "apply_filters" -Funktion - müssen Sie häufig in der Lage sein, die Gesamtheit Ihrer HTML-Ausgabe auf einmal zu erfassen. Wenn Sie einen großen, komplexen Block mit gemischten HTML- und Sekundärfunktionen erstellen, ist die Verwendung einer ob_start()/ob_get_ [] - Sequenz ein wesentlich effizienterer Weg, um dieses Ziel zu erreichen.

Also: Ein Plugin, auf dem ich gerade arbeite, gibt eine Tabelle aus, deren Elemente durch eine Reihe von Sekundärfunktionen zusammengesetzt werden. Nun könnte ich vorstellbar sein, die ganze Sache zu machen, indem ich Inhalt zu einer einzelnen Variable hinzufüge, aber es ist viel einfacher und ökonomischer, die Ausgangspufferung zu Beginn zu initiieren und dann den Code ohne die zusätzliche Abstraktionsebene $html .= [more and more HTML and PHP] am Ende den Code zu schreiben Weist die gesamte Ausgabe einer Variablen zu - $html = ob_get_clean(); und gibt dann die Variable mit der Funktion apply_filters zurück: return apply_filters('filter-tag' , $html); Object_start() und ob_get_clean() markieren außerdem Punkte im Code, in denen es sinnvoll ist, do_action-Hooks bereitzustellen.

Verwandte Themen