ob_start ob_get_clean ob_end_flush ob_clean ejemplo php optimization concatenation

ob_get_clean - php flush



¿Es mejor usar ob_get_contents() o $ text.=''Test''; (5)

He visto un montón de ob_get_clean() el último tiempo. Por lo general, 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_get_clean() :

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

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

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

¿Cual es mejor?


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 required):

ob_start(); ?> <? foreach($items as $item) { ?> <div><?= $item ?></div> <? } ?> <? $test = ob_get_clean();


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

Un pequeño punto, pero si vas a usar el enfoque de buffer de salida, también puedes usarlo completamente:

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


Los buffers de salida tienen todos los inconvenientes de las variables globales. ob_start() 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, en algún momento el buffering de salida fue algo más rápido en la concatenación de cadenas grandes, por razones internas a PHP. No estoy seguro si eso sigue siendo cierto.


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 tanto ob_get_contents () como 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 esto:

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

es sensiblemente más lento que esto:

echo ''<div>'', $ test, ''</ 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.