14 Stimmen

Ist es besser, ob_get_contents() oder $text .= 'test'; zu verwenden?

Ich habe in letzter Zeit viel ob_get_clean() gesehen. Normalerweise habe ich $test .= 'test' gemacht

Ich frage mich, ob das eine schneller und/oder besser ist als das andere.

Hier ist der Code mit ob_get_clean():

ob_start();

foreach($items as $item) {
    echo '' . $item . '';
}

$test = ob_get_clean();

Hier ist der Code mit $test .= 'test':

$test = '';

foreach($items as $item) {
    $test .= '' . $item . '';
}

Was ist besser?

6voto

Eran Galperin Punkte 84916

Die Ergebnisse sind die gleichen, und ich denke, dass die Leistungsunterschiede vernachlässigbar sind, wenn überhaupt. Im Grunde eine Frage der persönlichen Stilpräferenz. Ich würde mich für die Verkettung entscheiden - ich verwende die Ausgabepufferung nur, wenn die Verkettung keine Option ist.

Außerdem, anstatt sowohl ob_get_contents() als auch ob_clean() auszuführen, führen Sie einfach ob_get_clean() aus, das beides gleichzeitig durchführt.

6voto

Preston Punkte 1553

Output-Puffer haben alle Nachteile von globalen Variablen. Du musst dir aller Ausführungspfade von ob_start() bis zu ob_get_clean() bewusst sein. Bist du sicher, dass es dort ankommt und dass alle dazwischen geöffneten Puffer geschlossen wurden? Denk daran, dass Code Ausnahmen werfen kann. Das kann ein wirklich lustiger Fehler sein, den der nächste Kerl verfolgen muss.

Andererseits - und ich mag es kaum zu erwähnen - war Output-Pufferung einmal schneller beim Konkatenieren großer Zeichenketten, aus internen Gründen von PHP. Ich bin mir nicht sicher, ob das noch immer stimmt.

4voto

Ciaran McNulty Punkte 18410

Wenn Sie Bedenken wegen des Overheads der Zeichenkettenverknüpfung haben, sollten Sie beachten, dass dies langsamer ist:

echo '

'.$test.'

';

als dies:

echo '

', $test , '

';

Der erste compiliert zu zwei Zeichenkettenverknüpfungen gefolgt von einem echo, während der zweite nur zu drei echos kompiliert wird, was tatsächlich schneller ist.

2voto

Tom Haigh Punkte 56080

Ich denke, die Verwendung des Output-Pufferns kann einen kleinen Leistungsvorteil haben, wenn Sie massive Strings verwenden, aber für den normalen Gebrauch sind Sie meiner Meinung nach mit der Konkatenation besser dran, da dieser Code wahrscheinlich von anderen leichter zu verstehen und zu debuggen ist.

Ein kleiner Punkt, aber wenn Sie den Ansatz des Output-Pufferns nutzen möchten, können Sie ihn auch vollständig nutzen:

ob_start();

foreach($items as $item) {
    echo '';
    echo $item;
    echo '';
}

$test = ob_get_clean();

2voto

Alexander Malfait Punkte 2661

Wie bereits erwähnt, ist die Ausgabepufferung für die Leistung besser. Für große Zeichenfolgen ist der Leistungsunterschied keineswegs vernachlässigbar. Sie können die Ausgabepufferung in PHP mit StringBuffer/StringBuilder in Java vergleichen; für Zeichenkettenverkettung muss die gesamte Zeichenfolge jedes Mal im Speicher kopiert werden. Bei der Ausgabepufferung gelangt der Text in einen Puffer, der in sinnvollen Schritten wächst, und es ist nicht erforderlich, die Daten für jede Ausgabe zu kopieren.

Sie könnten auch darüber nachdenken, Inline-HTML zu verwenden (noch schneller). Ein weiterer Vorteil von Inline-HTML ist, dass Ihr IDE wahrscheinlich eine Syntaxhervorhebung für HTML durchführen kann, was nicht passiert, wenn das HTML innerhalb einer PHP-Zeichenkette enthalten ist. Modifizierter Code (short_open_tags = On erforderlich):

ob_start();
?>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X