9e.. Control de buffer de salida.

Page 1

1

Capítulo 10 Control de output en PHP

10 Control de Output en PHP 10.1 Introducción a output buffering PHP dispone de un interesante mecanismo que permite controlar la salida de los scripts php almacenando los datos en un buffer para luego procesarlos. A continuación se describe como usar estas funciones y también como aplicarlas para comprimir la salida al browser con gzip y otras aplicaciones más. Algunos de estos tips pueden acelerar dramáticamente la performance de un script PHP. Las funciones de output buffering de php son extremadamente útiles. Estas funciones proporcionan más control sobe el output generado por los scripts de lo que normalmente se tendría, y en algunos casos, este control es esencial. No sólo se tiene el control sobre cuando, donde y porqué se despliega el output, sino que también se puede controlar su manejo.

10.2 ¿De que se trata? La habilidad de poder controlar el sistema de buffering en PHP es una de las características más notables del lenguaje. Básicamente este mecanismo permite almacenar todo el contenido que el php genera en un buffer para luego darle la utilización que resulte conveniente, por ejemplo todo lo que se emite con "print", "echo" o similar se guarda en un buffer, luego el contenido se puede recuperar, se puede modificar antes de emitirlo al browser, etc. Como se verá hay varios usos posibles para este mecanismo por lo que resulta importante comenzar a ver como funciona:

10.3 Funciones de output buffering Las siguientes son las funciones más comunes, la lista completa se puede obtener del sitio php.net. ob_start ([callback function])

Inicia una sesión de output buffering.

ob_flush ( )

Envía el contenido del buffer al navegador y lo limpia.

ob_get_contents ( )

Regresa el contenido del buffer. Éste no es limpiado.

ob_end_clean ( )

Termina la sesión actual de buffering y limpia el buffer.

on_end_flush ( )

Termina la sesión actual de buffering y despliega el buffer.

ob_get_length ( )

Regresa el tamaño del buffer actual.

Programación

Arturo Ruvalcaba


2

Capítulo 10 Control de output en PHP

ob_get_clean ( )

Se compone de las funciones ob_get_contents ( ) y ob_end_clean ( ). Regresa el buffer y termina la sesión.

10.4 Lo básico. Se empezará con un programa simple que despliega “Hello World”. <?php // Start buffering ob_start(); print "Hello World"; // Grab the buffer $buffer = ob_get_contents(); // Stop buffering ob_end_clean(); // Display the buffer print "'$buffer'"; ?>

La function ob_start( ) inicia la sesión de output buffering. Se imprime “Hello World”, pero no se envía al navegador. En vez de eso se pone en el buffer hasta que se haga algo con el. Eso se hace al pasarlo a la variable $buffer llamando a la función ob_get_content( ). La función ob_end_clean( ) finaliza la sesión de output buffering, por lo cual el último comando de print se despliega en el navegador. Otro ejemplo: <?php ob_start(); print("foo bar"); $res=ob_get_contents(); ob_end_clean(); $res=str_replace("foo","goo",$res); echo "$res"; ?> En este ejemplo se muestra el proceso básico de "inicio de buffering", como se obtienen los resultados con ob_get_contents, como se modifican tratándolos como un string cualquiera y como se detiene el proceso de buffering (ob_end_clean) para que el próximo "echo" no vaya al buffer sino directamente al browser

10.5 Output buffering anidados. Se podría pensar que sucede si se llama dos veces a la función ob_start( ) sin cerrar la sesión. PHP lo maneja anidando los buffers. El siguiente script muestra como se hace esto. <?php // Open buffer #1 ob_start(); print "Line 1\n";

Programación

Arturo Ruvalcaba


3

Capítulo 10 Control de output en PHP

// Open buffer #2 ob_start(); print "Line 2\n"; // Grab the contents of buffer #2 $buf2 = ob_get_contents(); // Close buffer #2 ob_end_clean(); print "Line 3\n"; // Grab the contents of buffer #1 $buf1 = ob_get_contents(); // Close buffer #1 ob_end_clean(); // Output the buffer contents print $buf1; print $buf2; ?>

Sin conocer output buffering, se esperaría que las líneas se imprimirían en orden numérico. Sin embargo este no es el caso. Después de imprimir la línea 1, se abre un segundo buffer por lo que la salida “Line 2\n” se almacena en éste. A continuación se cierra la segunda sesión de output buffering. Después la salida “Line 3\n” se guarda en el primer buffer. Por lo anterior, el primer buffer captura las líneas 1 y 3, mientras que el segundo buffer captura la línea 2. Con lo anterior se muestra que se pueden construir funciones y scripts con output buffering sin preocuparse de armar un lío en la lógica del algoritmo. Mientras que siempre se recuerde cerrar todo buffer que se abra, no se tendrá problema alguno.

10.6 Handlers para manejo de output Uno de los más poderosos elementos de output buffering es la capacidad de definir funciones de retorno. Es posible pasar como parámetro el nombre de una función a "ob_start" de forma tal que cuando termina el proceso de buffering, al hacer un ob_end_clean u ob_end_flush la función sea llamada. Esta función de retorno recibe el buffer como un parámetro. El valor regresado es desplegado. Ejemplo: <?php // Start buffering with a callback function ob_start("callback"); print "Line 1\n"; print "Line 2\n"; // Flush the contents ob_flush(); print "Line 3\n"; // Define the callback function function callback($buffer) { return "Here's the buffer: $buffer";

Programación

Arturo Ruvalcaba


4

Capítulo 10 Control de output en PHP

} ?>

Este script manda desplegar las lineas 1 a 3. Después de desplegar la línea 2, el buffer se vacía. Esto pasa los datos a la función de retorno, la cual lo maneja creando un pequeño mensaje. Puesto que el buffer no se ha cerrado antes del final del script, PHP automáticamente vacía el buffer, lo cual llama a la función de retorno una vez más. Otro ejemplo:

<?php function procesar($data) { $data=str_replace("foo","hoo",$data); return $data; } ob_start("procesar"); print("foo bar"); ob_end_flush(); ?> En este ejemplo hay que observar lo siguiente: se le pasa a ob_start el "nombre" de la función que se debe invocar al cerrar el buffer. Luego notar el uso de ob_end_flush que hace dos cosas: cierra el buffer, invoca al handler de ob_start y emite sus contenidos al browser. No se puede hacer un ob_get_contents seguido de ob_end_clean y un echo ya que cuando se hace el ob_get_contents aún no se invoco el handler. Cuando se usen funciones de retorno se debe tener presente lo siguiente: Se tiene que regresar lo que se quiere desplegar, no imprimirlo. El comando print no funciona en la función de retorno (callback). También, no se puede usar output buffering dentro de una función de retorno.

10.7 Output buffering y la función header( ) A continuación se mostrará un problema común, y un modo fácil de solucionarlo. Este es un error común que algunos programadores lo cometieron en sus inicios con PHP. Ejemplo: <html> <body> <?php echo "You will now be directed to google.com...\n"; header("Location: http://www.google.com"); ?> </body> </html>

Quien tenga un poco de experiencia en PHP sabrá que no se puede usar la función header() después de haber realizado algún output. El output en este programa se está realizando con la función echo. Este programa mostrará el error "cannot add header information, headers already sent". A continuación se muestra como usar las funciones de output buffering para evitar este problema. Ejemplo: Programación

Arturo Ruvalcaba


5

Capítulo 10 Control de output en PHP

<?php //start output buffering ob_start(); ?> <html> <body> <?php echo "You will now be directed to google.com...\n"; header("Location: http://www.google.com"); ?> </body> </html> <?php //send the contents of the buffer to the browser ob_end_flush(); ?>

El error también se puede solucionar poniendo la función header( ) al inicio, pero aquí se está explicando el uso de las funciones de output buffering.

Programación

Arturo Ruvalcaba


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.