Control de Output en PHP

Escrito el 6 Febrero, 2001 – 9:08 | por storm | 4.220 lecturas

PHP4 dispone de un interesante mecanismo que permite controlar la salida de los scripts php almacenando los datos en un buffer para luego procesarlos. En este articulo se describe como usar estas funciones y tambien como aplicarlas para comprimir la salida al browser con gzip y otras aplicaciones mas. Algunos de estos tips pueden acelerar dramaticamente la performance de un script PHP.

Buffering Output en PHP

Garland Foster

¿De que se trata?

La habilidad de poder controlar el sistema de buffering en PHP es una de las caracteristicas mas notables del lenguaje y dado que recien surge en la version 4.0.3 es probable que no todos la conozcan. Basicamente este mecanismo permite almacenar todo el contenido que el php genera en un buffer para luego darle la utilizacion 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 veremos hay varios usos posibles para este mecanismo por lo que resulta importante comenzar a ver como funciona:

Buffering

Pueden encontrar la descripcion de todas las funciones de control de output en php.net, a continuacion describiremos las funciones basicas de control de output:

ob_start();print("foo bar");$res=ob_get_contents();ob_end_clean();$res=str_replace("foo","goo",$res);echo "$res";

En el ejemplo mostramos el proceso basico de “inicio de buffering”, como obtener los resultados con ob_get_contents, como modificarlos tratandolos como un string cualquiera y como detener el proceso de buffering (ob_end_clean) para que el proximo “echo” no vaya al buffer sino directamente al browser

Handlers para manejo de output

Es posible pasar como parametro el nombre de una funcion a “ob_start” de forma tal que cuando termina el proceso de buffering, al hacer un ob_end_clean u ob_end_flush la funcion sea llamada para modificar el mismo, esto se hace de la siguiente manera:

function procesar($data) {   $data=str_replace("foo","hoo",$data);   return $data;}

ob_start("procesar");print("foo bar");ob_end_flush();

En el nuevo ejemplo hay algunos cambios, en primer lugar notar como se le pasa a ob_start el “nombre” de la funcion 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 aun no se invoco el handler.

Comprimiendo la salida al browser

Una de las aplicaciones mas interesantes del mecanismo de control de buffering es la compresion de la salida al browser. Casi todos los browsers modernos incluyendo Netscape 4.x e Internet Explorer 4.x aceptan datos comprimidos con “gzip”, podemos, entonces cambiar el codigo de la siguiente manera:

if (strstr($HTTP_SERVER_VARS['HTTP_ACCEPT_ENCODING'], 'gzip')) { header("Content-Encoding: gzip"); }

function encode($output){    // We can perform additional manipulation on $output here, such    // as stripping whitespace, etc.    return gzencode($output);}

ob_start();ob_implicit_flush(0);print "Hola mundoooo";$cosa=ob_get_contents();ob_end_clean();if (strstr($HTTP_SERVER_VARS['HTTP_ACCEPT_ENCODING'], 'gzip')) {  header("Content-Encoding: gzip");  $cosa=str_replace("Hola","Atencion",$cosa);  $sale=encode($cosa);  echo $sale;} else {  echo $cosa;}

De esta forma el contenido que entrega el PHP al browser viaja comprimido con Gzip con el consiguiente ahorro de tiempo de transmision por HTTP, alguno sitios usando este tipo de compresion reportan mejoras de entre el 40 y el 60\% en el tiempo de download de las paginas

Aplicaciones

El control de output tiene muchas mas aplicaciones interesantes, como por ejemplo la posibilidad de realizar un cache de las paginas que se emiten en un archivo, base de datos o archivo dbm o similar, de forma tal de no regenerar la pagina cada vez que se pide la misma al server, esto es muy util en sitios que generan las paginas dinamicamente a partir de datos desde sus bases de datos. En motores de generacion de paginas bien elaborados puede incluso cachearse ciertas areas de la pagina para ahorrar tiempo dejando que las otras se generen dinamicamente cada vez.

Otro uso interesante parte de la idea de no generar HTML sino XML desde PHP y luego usar XSLT para convertir el XML en HTML, esto puede hacerse facilmente capturando la salida del buffer, convirtiendo la misma a HTML usando XSLT y luego emitiendo la salida definitiva

Garland Foster

You must be logged in to post a comment.

Buscar: