23 de abril de 2015

ob_start PHP

Al programar en PHP primero se realiza un procesamiento de la página que se muestra en el ordenador del usuario, luego se envía la petición al servidor y por último se envía al ordenador del usuario el resultado de procesar el código PHP.

Por regla general, a medida que va procesando la página, se envía el código HTML resultante al cliente, pero esta configuración se puede cambiar, incluso en tiempo de ejecución. PHP proporciona un buffer da la opción de almacenar la salida de información que se muestra al usuario a medida que se va generando de modo que no se envíe ningún dato al cliente hasta que se indique expresamente.

Este comportamiento es muy útil cuando se ocupan funciones como header() o setcookie() que deben ejecutarse antes de haber enviado ningún texto de la página al cliente. En caso contrario se producirá un error "Cannot modify header information - headers already sent by".

La función ob_start() sirve para indicarle a PHP que se ha de iniciar el buffering de la salida, es decir, que debe empezar a guardar la salida en un bufer interno, en vez de enviarla al cliente. De modo que, aunque se escriba código HTML con echo o directamente fuera del código PHP, no se enviará al navegador hasta que se ordene explícitamente o eventualmente, hasta que se acabe el procesamiento de todo el archivo PHP.

La función ob_end_flush() sirve para indicar a PHP que se desea realizar el volcado de todo el bufer en la salida, con lo que se enviará al cliente que ha solicitado la página.

La función ob_get_contents() entrega la información almacenada en el contenido del búfer de salida, o FALSE si el almacenamiento en el búfer de salida no está activo. La función ob_end_clean() se utiliza para limpiar el buffer, de esta manera el buffer ya no tendrá ninguna información, antes de utilizarse debería haberse mostrado la información al usuario ya sea con ob_end_flush o con ob_get_contents() de lo contrario se habrá perdido y no sera posible mostrarla.

Presento un ejemplo muy básico pero para lo que representan las funciones ob_ se puede considerar completo, recuerda que un código debidamente ordenado es la mejor opción, para mayor referencia dejo este link con las funciones de control de salida: http://php.net/manual/es/ref.outcontrol.php
<?php
    
    // imprime resultado al utilizer ob_end_flush()
    ob_start();
    print "Hola primer ejemplo\n";
    ob_end_flush();

    // No imprime pues utiliza ob_end_clean directamente
    ob_start();
    print "Hola Segundo ejemplo\n";
    ob_end_clean();

    // imprime Hola pabletoreto al utilizer ob_get_contents() y echo
    ob_start();
    echo “Hola pabletoreto”
    $contenido = ob_get_contents();
    Echo “contenido del buffer” .$contenido
    ob_end_clean();
    
    // imprime porque llega al fin del script
    ob_start();
    print "Hola fin de script!\n";

?>