Una fuente de mucha frustración y confusión para quienes arrancan con PHP es el manejo de sesiones.
Hay muchas partes móviles y, a veces, tener todo esto en la cabeza marea…
En este artículo intentaré hacer un repaso por cuáles son esas partes y cómo interactúan entre sí de modo que no te queden dudas respecto de cómo usar esta poderosa herramienta.
Para qué sirven las sesiones
Por supuesto que no puedo avanzar sin antes hablar de lo más importante: ¿para qué sirven las sesiones? O, dicho de otro modo: ¿por qué querrías complicarte la vida entendiendo todo esto?
En pocas palabras: las sesiones sirven para compartir información no entre una página y otra (Un formulario HTML y el php que lo procesa por ejemplo), si no entre todas las páginas por las que el visitante pase.
Un ejemplo simple de esto es cuando visitas un sitio y ves tu nombre de usuario en todas las páginas:
Aunque sólo te identificaste una vez.
Dónde se almacena la información de las sesiones
Una pregunta sumamente importante es dónde se almacena esta información.
Para empezar es importante comprender que la información de la sesión está almacenada del lado del servidor.
Usualmente se guarda físicamente en archivos en el disco de la computadora que actúa como WebServer, aunque esta no es la única opción.
Si querés saber exactamente dónde está guardada la información de las sesiones tenés que consultar dos variables de configuración de php:
En cualquiera de los casos, la información almacenada es el resultado de la serialización de la información.
Cómo se guardan datos en la sesión
Para guardar datos en la sesión de un usuario existe un arreglo llamado $_SESSION
.
Este arreglo está presente siempre (es lo que se conoce como una variable super global).
Entonces, guardar un elemento en la sesión del usuario es tan simple como hacer:
<?php $_SESSION['var'] = 'value';
Cómo se recuperan datos de la sesión
Del mismo modo, recuperar datos de la sesión se reduce a leer el contenido del arreglo:
<?php $var = $_SESSION['var'];
Cómo se eliminan datos de la sesión
Si lo que necesitas es quitar algún dato de la sesión basta con utilizar la función unset()
:
<?php unset($_SESSION['var']);
Cómo se vincula una sesión en el servidor con un cliente
Esperablemente tu aplicación web tendrá muchos usuarios conectados a la vez.
Seguramente no estés muy interesado en que el usuario A vea (o peor… ¡modifique!) los datos de la sesión del usuario B.
Para evitar que esto suceda se necesita que cada sesión pueda vincularse a un (y sólo un) cliente.
Efectivamente, cada sesión tiene un identificador único: el ID de sesión.
En el caso del almacenamiento en archivos, el nombre de cada uno de ellos corresponde al ID de la sesión cuyo contenido está guardado dentro.
Es decir, si tenemos un ID de sesión toqn1cl46210ear4e5t7seg6g7
encontraremos un archivo con ese mismo nombre en el directorio donde se almacenan las sesiones en el servidor.
Si querés saber cuál es tu ID de sesión podés usar la función session_id()
Este ID se genera cuando se crea la sesión, mediante el uso de la función session_start()
Hasta acá no creo que haya mucho misterio, ¿cierto?
Bueno, pues aquí es donde tenemos que ir un poco más atrás para comprender realmente qué pasa.
Las aplicaciones web están basadas en el protocolo HTTP.
Este protocolo estuvo pensado y diseñado en función de las necesidades de la web estática (Es decir, una web en la cual a todos los visitantes se les mostraba el mismo contenido).
En un contexto donde da lo mismo si el que pidió la página B antes había pedido la página A no tiene sentido gastar recursos en implementar sesiones…
Claro que, hoy en día las cosas son MUY diferentes… desafortunadamente, las aplicaciones web siguen estando basadas en HTTP, con lo cual, para mantener la coherencia entre diferentes peticiones sucesivas es necesario recurrir a algunos trucos.
Básicamente, se necesita que el cliente informe al servidor cuál es su ID de sesión en cada petición.
Esto puede realizarse de dos formas:
- A través de la URL (agregando un parámetro
?SID=$sid
) - Mediante una cookie
El primer método no es muy aconsejable por un tema de seguridad, el segundo, si bien no es infalible, es mucho mejor.
En caso de optar por la segunda opción, necesitarás que esa cookie se genere en el cliente luego de iniciar la sesión.
Podrías usar setcookie
, pero sería un poco redundante: session_start()
ya lo hace 😉
Claro que, dado que todo este proceso se realiza mediante el intercambio de encabezados HTTP, debes tener cuidado de llamar a session_start()
antes de enviar contenido al cliente.
Qué hace exactamente la función session_start()
session_start()
es una función algo rara.
Digo rara porque realiza varias tareas según el caso, algo que en general no es muy aconsejable.
Si la petición NO viene con una cookie (o un parámetro SID
) O el valor no corresponde con una sesión activa en el servidor:
- Se genera un nuevo ID de sesión
- Se inicializa el espacio de almacenamiento en el servidor
- Se envía el encabezado correspondiente a la creación de la cookie de sesión (Asumiendo por supuesto que este el método de propagación de ID seleccionado)
Si la petición SI viene con una cookie (o un parámetro SID
) Y el valor corresponde con una sesión activa en el servidor:
- Se lee el contenido del archivo de sesión correspondiente
- Se inicializa el arreglo
$_SESSION
con los valores contenidos en dicho archivo
Cómo se destruye una sesión
Por último, en el caso de que quieras destruir por completo el contenido de una sesión (Por ejemplo, el caso en que un visitante esté abandonando tu aplicación), la función session_destroy()
se encargará de ello.
Un detalle importante a tener en cuenta es que session_destroy()
sólo actuará del lado del servidor, así que, para mayor seguridad es conveniente usar setcookie()
para eliminar la cookie del lado del cliente