Control de la salida en PHP

  • Por
PHP dispone de funciones para controlar en la salida de datos hacia el cliente. Se puede almacenar la salida en un buffer, para enviarla al cliente cuando se desee.
Como sabemos, PHP realiza un procesamiento de la página y 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.

Con PHP podemos almacenar la salida, a medida que se va generando, en un buffer. De modo que no se envíe ningún dato al cliente hasta que se indique expresamente. Existen una serie de funciones que se utilizan para conseguir este comportamiento, que son las funciones de control de salida.

Este comportamiento es muy útil cuando se tiene que enviar información en la cabecera de la página, después de haber empezado a procesar el código PHP y haber empezado a generar la salida.

Nota:Como debemos saber, existen 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…"

En este artículo veremos un pequeño ejemplo de código PHP que realiza el buffering de la salida, para enviarla una vez se ha terminado de procesar todo el código.

Utilizaremos dos funciones que posiblemente no conozcamos, para el control de la salida: ob_start() y ob_end_flush().

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.

Veamos este código:

<?
ob_start();
echo "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">"
?>
<html>
<head>
<title>Página procesada con buffer de salida</title>
</head>
<body>
Esta es mi página!!!
</body>
</html>
<?
setcookie("nombre", "pepe");
ob_end_flush();
?>


Nada más comenzar se ejecuta ob_start(). Con esto se guardará toda la salida en un buffer. Ahora, cuando se escribe en la página, en la siguiente línea con el echo, y en las otras, fuera del código PHP, lo único que ocurre es que se va llenando el mencionado buffer.

Antes de terminar la página, en el siguiente bloque de código PHP, se envía una cookie al navegador del usuario. Esa cookie llega sin problemas y no genera ningún error, a pesar que se ha escrito código de la página, dado que el código no se había enviado al navegador, sino que se había almacenado en el buffer.

Por último, se ejecuta ob_end_flush() para enviar el buffer a la salida.

Podemos probar a comentar las líneas que ejecutan las funciones ob_start() y ob_end_flush(). Entonces veríamos como la función setcookie() provocaría un error, porque esta función no se puede ejecutar si ya se ha escrito texto en la página y por tanto se han enviado ya las cabeceras del http al cliente.

Es un ejemplo muy sencillo del control de la salida en PHP. Pero a partir de aquí se puede complicar todo lo que se necesite. Esperamos que este artículo sea una interesante introducción para continuar investigando temas relacionados con esta funcionalidad básica de PHP.

Puede resultarte interesante seguir con este tema, por lo que te recomiendo que leas el artículo Control de salilda en PHP II .

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Gorlex

18/1/2016
funciono
muchas gracias,
tenia un login donde se tenia una desicional con dos cabezeras diferentes, y al ejecutar, me salia un error de cabezeras.
este ejemplo me ayudo a solucionar el problema, ya que no envia las dos cabezeras al mismo tiempo, solo la que ya selecciono el usuario.
Gracias!!!