Cuando estamos trabajando en el desarrollo de sitios web, en ciertos casos necesitamos enviar valores en los headers http de la página web. Un ejemplo de esto es el uso de cookies que al establecer su valor, se envía la petición de almacenamiento en el header de la página. También al hacer redireccionamientos desde php por medio del uso de la función header().

Algo que debemos de conocer al hacer uso de estas funciones es que no podemos mandar a escribir ninguna salida (html, xml, etc) en el script antes de enviar los headers. Esto es debido a que cuando el servidor web devuelve la salida de nuestro script , este implicitamente debe mandar al navegador los headers de la página web, por lo cual ya no los podemos modificar posteriormente.

En el siguiente ejemplo podremos observar mejor lo que expliqué en el parráfo anterior. Es un trozo de código de php que imprime un código html y luego establece el valor de una cookie:

<html>
<body>
<p>prueba de seteo de cookies</p>
</body>
</html>
<?php
$val='cookie de prueba';
if(setcookie("var", $val,time()+3600,'/')){
echo "seteo cookie";
}
?>

Este código nos va a generar el siguiente error:

Warning: Cannot modify header information - headers already sent by (output started at C:\Program Files\xampp\htdocs\tipsdeaweb\ejemplo_buffer.php:6) in C:\Program Files\xampp\htdocs\tipsdeaweb\ejemplo_buffer.php on line 9

Esto se debe a que con el seteo del valor de la cookie estamos tratando de modificar los headers de la página, que ya han sido enviados cuando se escribió el código HTML. Esto lo podemos solucionar utilizando funciones para escribir en el búfer del script de php, lo cual hará que el servidor web no enviará los headers ni el HTML que escribimos, sino hasta que nosotros liberemos el búfer. Esto nos permite guardar toda la salida del script en memoria y poder hacer modificaciones a los headers. Los nombres de las funciones que utilizaremos son: ob_start (está función indica que todo lo que escribamos a la salida del script se almacenará en memoria y no se enviará como respuesta del servidor web) y ob_flush (indica que debe de liberar y escribir todo lo que se almacenó en el búfer).

A continuación el nuevo script con las funciones de manejo de búfer el cual nos permite setear la cookie.

<?php
ob_start();
?>
<html>
<body>
<p>
prueba de seteo de cookies</p>

</body>
</html>
<?php

$val='cookie de prueba';
if(setcookie("var", $val,time()+3600,'/')){
echo "seteo cookie";
}
ob_end_flush();
?>

Si probamos este script podemos ver que ya no nos genera ningún warning de php, y que efectivamente seteó el valor de la cookie en nuestro navegador.

Deja un comentario