2008-11-15 15 views
14

He visto un montón de ob_get_clean() la última vez. Normalmente he hecho $test .= 'test'

Me pregunto si una es más rápida y/o mejor que la otra.

Aquí está el código que utiliza ob_get_clean():

ob_start(); 

foreach($items as $item) { 
    echo '<div>' . $item . '</div>'; 
} 

$test = ob_get_clean(); 

Aquí está el código que utiliza $test .= 'test':

$test = ''; 

foreach($items as $item) { 
    $test .= '<div>' . $item . '</div>'; 
} 

¿Qué es mejor?

+0

Me lo he estado preguntando recientemente. No sé la respuesta, pero sé que te falta un "echo $ test"; en este último ... – da5id

+0

El primero no repite la variable. Simplemente pone toda la parte con eco en $ prueba. Y vote si está arriba si le gusta :) –

Respuesta

6

Los búfers de salida tienen todos los inconvenientes de las variables globales. Debe conocer todas las rutas de ejecución desde ob_start() hasta ob_get_clean(). ¿Estás seguro de que va a llegar allí, y que cualquier búfer abierto en el medio se habrá cerrado? Tenga en cuenta que el código puede arrojar excepciones. Eso puede ser un error muy divertido para el próximo chico que busque.

Por otro lado, y detesto mencionarlo, al mismo tiempo el almacenamiento en búfer de salida era algo más rápido para concatenar cadenas grandes, por razones internas a PHP. No estoy seguro si eso sigue siendo cierto.

6

Los resultados son los mismos, y me imagino que las diferencias de rendimiento son insignificantes, en su caso. Básicamente, una cuestión de preferencia de estilo personal. Me gustaría ir con la concatenación a mí mismo - Yo uso el buffer de salida solo cuando la concatenación no es una opción.

Además, en lugar de ejecutar ambos ob_get_contents() y ob_clean() simplemente ejecute ob_get_clean() que realiza ambos a la vez.

+0

buena llamada en el ob_get_contents vs ob_get_clean. cambiado –

+1

Lamento resucitar una publicación de 4 años, pero me encontré con ella y quería señalar que 'ob_get_contents()' seguido de 'ob_clean()' no es exactamente lo mismo que 'ob_get_clean()'. Para los fines del OP, probablemente esté bien, pero 'ob_get_clean()' ** finaliza el buffer de salida ** mientras que 'ob_get_contents()' y 'ob_clean()' no. De acuerdo con el manual, 'ob_get_clean()' es esencialmente lo mismo que ejecutar 'ob_get_contents()' seguido de ** 'ob_end_clean()' **. – Travesty3

2

Creo que usar el buffer de salida puede tener un pequeño beneficio de rendimiento cuando se usan cadenas masivas, pero para el uso común es mejor con concatenación en mi opinión ya que este código será más fácil de entender y depurar por otros.

Un pequeño punto, pero si usted va a utilizar el enfoque de búferes de salida, es posible también utilizar plenamente:

ob_start(); 

foreach($items as $item) { 
    echo '<div>'; 
    echo $item; 
    echo '</div>'; 
} 

$test = ob_get_clean(); 
+1

¿Qué tan grande es "masivo"? –

+0

hmm, sí, no sé. No he hecho ninguna medida. punto justo –

2

Como se mencionó anteriormente, el almacenamiento en búfer de salida es mejor para el rendimiento. Para cadenas grandes, la diferencia de rendimiento no es despreciable en absoluto. Puede comparar el almacenamiento en búfer de salida en PHP con StringBuffer/StringBuilder en Java; para la concatenación de cadenas, toda la cadena debe copiarse en la memoria todo el tiempo. Para el almacenamiento en búfer de salida, el texto entra en un búfer que crece en incrementos razonables, y no hay necesidad de copiar los datos para cada salida.

También podría pensar en usar HTML en línea (incluso más rápido). El beneficio adicional para HTML en línea es que su IDE puede realizar resaltado de sintaxis en el HTML, lo que no sucederá cuando el HTML se encuentre dentro de una cadena de PHP. código modificado (short_open_tags = On requerido):

ob_start(); 
?> 

<? foreach($items as $item) { ?> 
    <div><?= $item ?></div> 
<? } ?> 

<? 
$test = ob_get_clean(); 
4

Si usted está preocupado por la sobrecarga de la concatenación de cadenas que debería ser en cuenta que esta:

echo '<div>' $ prueba..'</div >';

es mensurable más lento de lo siguiente:

echo '<div>', $ prueba, '</div >';

El primero se compila con dos concates de cuerda seguidos por un eco, mientras que el segundo se compila solo con tres ecos, que en realidad es más rápido.

Cuestiones relacionadas