Alessio Mavica PHP & MySQL Developer, Project Leader & Scrum Master

24ago/110

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?

    ¡Suscríbete a nuestro feed RSS!

Comentarios (0) Trackbacks (0)

Aún no hay comentarios.


Leave a comment

(required)


+ cuatro = 5

Aún no hay trackbacks.