PHP Output Buffering Control
Cuando después de una petición el servidor envía el html al cliente, éste no se devuelve de una única vez sino a trozos.
¿Podemos hacer algo para controlarlo? La respuesta está en el Output Buffering Control de PHP.
La idea es muy sencilla:
Guardar el output en una variable y devolverla de una única vez.
VENTAJAS:
Las vantajas de utilizar el Output Buffering Control son múltiples:
- Mayor velocidad
- Menor utilizo de banda
- Mayor control
- Posibilidad de redirigir el output a un fichero
- Manipular el output
- Configurar header y cookie en cualquier punto del código
FUNCIONES:
La función para empezar a utilizar un Output Buffering Control es ob_start. Podemos pasar un parametro para definir la función callback.
La más utilizada es ob_gzhandler que permite comprimir nuestro output con el algoritmo gzip.
Podemos eliminar el output buffering con dos funciones:
- ob_end_clean: limpia el output buffering
- ob_end_flush: envía el output buffering al cliente y termina
Otras funciones útiles son:
- ob_clean: limpia el buffer de salida
- ob_get_clean: devuelve el buffer para almacenarlo en una variable y lo limpia
- ob_get_flush: devuelve el buffer al cliente y lo limpia
- ob_get_length: devuelve la longitud actual del buffer
- ob_get_level: devuelve el nivel de anidamiento del mecanismo de buffer (se pueden anidar más buffers)
- ob_get_status: devuelve el estado del buffer actual (o de todos si pasamos el parámetro TRUE)
- ob_implicit_flush: por defecto si no llamamos la función ob_end_flush se ejecuta automáticamente al final del script
- output_add_rewrite_var: añade una variable (nombre=valor) en cada URL que no sea absoluta y un campo hidden en los formularios
- output_reset_rewrite_vars: restablece los valores del mecanismo de re-escritura de URLs
EJEMPLOS:
<php ob_start(); echo "Hello World!"; ob_end_flush(); ?>
Para realizar la compresión del output tenemos que pasar el parámetro ob_gzhandler a la función ob_start:
<?php
ob_start('ob_gzhandler');
echo "Hello World!";
ob_end_flush();
?>
TIPS:
Podemos llamar a una función callback que nos limpie todo el output antes de enviarlo al cliente.
Aquí algunos usos frecuentes:
- remover espacios blancos repetidos:
trim(preg_replace('/\s+/', ' ', $buffer));
- codificar entidad HTML: por ejemplo
$buffer = str_replace('&', ' &', $buffer);
- redirigir el output a un fichero
PERFORMANCE:
Utilizando este simple script he registrado una mejora del 10% en la velocidad y el tamaño de la página ha pasado de 244.2KB a 612B
<?php
ob_start('ob_gzhandler');
for ($j=1; $j <= 5; $j++)
{
list($usec, $sec) = explode(" ",microtime());
$debut[$j] = ((float)$usec + (float)$sec);
echo str_repeat("0123456789",5000) . '<br>' ;
list($usec, $sec) = explode(" ",microtime());
$fin[$j] = ((float)$usec + (float)$sec);
}
echo '<br><br>TEST PERFORMANCE</br><br>';
$total = 0;
for ($j=1; $j <= 5; $j++)
$total += round($fin[$j]-$debut[$j], 5) . '<br>';
echo 'TOTAL: '. $total;
ob_end_flush();
?>
¿Te gustó este artículo?
Aún no hay trackbacks.