Pregunta

He visto mucho ob_get_clean() el último tiempo. Normalmente he hecho $test .= 'test'

Me pregunto si uno es más rápido y / o mejor que el otro.

Aquí está el código usando <=>:

ob_start();

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

$test = ob_get_clean();

Aquí está el código usando <=>:

$test = '';

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

¿Cuál es mejor?

¿Fue útil?

Solución

Las memorias intermedias de salida tienen todas las trampas de las variables globales. Debe tener en cuenta todas las rutas de ejecución desde ob_start() a ob_get_clean(). ¿Estás seguro de que llegará allí, y de que cualquier búfer abierto en el medio habrá sido cerrado? Tenga en cuenta que el código puede arrojar excepciones. Eso puede ser un error muy divertido para que el próximo tipo lo rastree.

Por otro lado, y odio mencionarlo, en un momento el búfer de salida fue algo más rápido para concatenar cadenas grandes, por razones internas de PHP. No estoy seguro de si eso sigue siendo cierto.

Otros consejos

Los resultados son los mismos, y me imagino que las diferencias de rendimiento son insignificantes si las hay. Básicamente, una cuestión de preferencia de estilo personal. Yo mismo iría con la concatenación: uso el almacenamiento en búfer de salida solo cuando la concatenación no es una opción.

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

Si le preocupa la sobrecarga de la concatenación de cadenas, debe tener en cuenta que esto:

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

es mucho más lento que esto:

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

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

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

Un pequeño punto, pero si va a utilizar el enfoque de búfer de salida, también puede utilizarlo por completo:

ob_start();

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

$test = ob_get_clean();

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 insignificante 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 cada vez. Para el almacenamiento en búfer de salida, el texto entra en un búfer que crece en incrementos sensibles, y no hay necesidad de copiar los datos para cada salida.

También puede pensar en usar HTML en línea (incluso más rápido). El beneficio adicional para el HTML en línea es que su IDE probablemente pueda resaltar la sintaxis en el HTML, lo que no sucederá cuando el HTML esté dentro de una cadena PHP. Código modificado (short_open_tags = On obligatorio):

ob_start();
?>

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

<?
$test = ob_get_clean();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top