¿Que es una sesión?
Un sesión en una web se puede definir como el recorrido de páginas que un usuario hace en nuestro sitio, desde que entra hasta que lo abandona. Gracias al uso de sesiones podemos reconocer las peticiones de cada usuario y así llevar a cabo acciones específicas, como mostrar información adaptada a él o guardar información de sus gustos o páginas que más visita.
Podemos entonces decir que pueden diferenciarse dos tipos de sesiones:
- Sesiones “activas”: las que muestran información personalizada según el usuario, por ejemplo, cuando inicia sesión en una web.
- Sesiones “pasivas”: el servidor reconoce cada movimiento del usuario y lo almacena de forma que en un futuro, se le mostrará una web con la información que al usuario le pueda parecer más interesante sin que se dé cuenta.
Lógicamente, una web puede incorporar los dos tipos de sesiones, véase el caso de los servicios ofrecidos por Google
.
¿Cómo funcionan?
Las sesiones se basan en un identificador generado por visitante, simulando una especie de DNI, de modo que cuando quiera acceder a cualquier página de nuestro sitio, mostrará ese “DNI” y quedará identificado. El identificador será único por cada usuario y se le conoce comoSession ID (SID).
Ahora la pregunta es ¿Como se gestiona dicho SID? pues muy fácil, con Cookies. Si no sabes muy bien que son, te recomiendo mi anterior artículo Introducción a Cookies en la Web. Una cookie es información que se establece desde el servidor y que el navegador del usuario envía en cada petición de forma abstracta. Entonces, si establecemos en una cookie el identificador de sesión, ya tenemos nuestra tarjeta identificadora lista.
Desde el lado del servidor, se debe implementar toda la lógica de la sesión, almacenando todos los SID activos y la información relativa a ellos. Esto se puede hacer de múltiples formas: mediante sistema de ficheros, base de datos, memcached o cualquier otro método de almacenamiento de información.
Manejo de sesiones en PHP
PHP, como es de esperar tiene todo un set de funciones para el manejo de sesiones de forma que abstrae bastante la labor del desarrollador. Entre otras cosas, llevará a cabo las siguientes tareas:
- Identificación por cookie del SID.
- Si no existe el SID, crea uno y lo guarda en las cookies.
- Almacenamiento de información relativa al SID en el sistema de ficheros.
- Gestión del expirado de sesión.
Almacenar y/o recuperar información sobre la sesión actual es tan fácil como usar un array global llamado $_SESSION.
Con todo esto, el uso de sesiones en PHP se hace realmente fácil. Aunque los creadores de PHP no nos quieren encadenar y nos permiten crear nuestras propias funciones para gestionar las sesiones de forma manual, como veremos más adelante en un ejemplo.
Usando los manejadores de PHP
Vamos a mostrar un ejemplo de como crear una sesión por visitante y almacenar información persistente durante la sesión
- <?php
- //Inicia o recupera la sesión
- session_start();
- //Ejemplo de como crear una variable de sesión
- if(!isset($_SESSION['user_name'])){
- $_SESSION['user_name'] = getUserName();
- }
- //Actualiza o crea una variable de sesión
- $_SESSION['last_access'] = time();
Es importante informar sobre la función session_start. Dicha función se encarga de crear o cargar una sesión previamente abierta basándose en el SID pasado por cookies. Algo a tener muy en cuenta, es que al estar basado en cookies, el server generará cabeceras HTTP, por lo que es importante llamar a la función antes de que se envíe cualquier salida de texto.
Si no recibirás un error que dice algo como “headers already sent”. De hecho os recomiendo que pongáis la llamada en la primera línea de vuestro index.php para evitar problemas.
Usando manejadores propios
Como hemos dicho, PHP nos permite declarar nuestras propias funciones para gestionar las sesiones de forma personalizada, a continuación os dejo una clase base que podéis rellenar para crear vuestros manejadores:
- <?php
- /**
- * Manejador de sesiones
- *
- */
- class Session
- {
- /**
- * Abre la sesión
- * @return bool
- */
- public static function open() {
- }
- /**
- * Cierra la sesión
- * @return bool
- */
- public static function close() {
- }
- /**
- * Lee la sesión
- * @param int session id
- * @return string contenido de la sesión
- */
- public static function read($id) {
- }
- /**
- * Guarda la sesión
- * @param int session id
- * @param string contenido de la sesión
- */
- public static function write($id, $data) {
- }
- /**
- * Destruye la sesión
- * @param int session id
- * @return bool
- */
- public static function destroy($id) {
- }
- /**
- * Colector de basura
- * @param int life time (sec.)
- * @return bool
- */
- public static function gc($max) {
- }
Una vez que tengas la clase adaptada a tus necesidades, necesitas indicarle a PHP que use eses métodos y no los que usa por defecto.
Eso se consigue con la función session_set_save_handler:
- ini_set('session.save_handler', 'user');
- session_set_save_handler(array('Session', 'open'),
- array('Session', 'close'),
- array('Session', 'read'),
- array('Session', 'write'),
- array('Session', 'destroy'),
- array('Session', 'gc')
- );
- session_start();
Configuración de sesiones en PHP
En la documentación oficial, podéis acceder a esta página en la que se muestra un listado completo de todas las variables de configuración (en el fichero php.ini), no obstante, vamos a ver algunas que tienen bastante importancia.
session.save_path
Especifica en que directorio será almacenda la informacion de los distintos SID generados. En este directorio tiene que poder escribir el usuario de Apache, que será el creador de los ficheros en última instancia.
session.name
Especifica el nombre de la sesión por defecto, que será a su vez el nombre de la cookie establecida por el servidor. Por defecto se llama PHPSESSID pero es recomendable cambiarlo.
session.gc_maxlifetime
Es el número de segundos tras el cual la información almacenda pasa a ser considerada basura y por tanto borrada cuando se lance el colector de basura (Garbage Collector).
session.cookie_lifetime
Establece los segundos durante los cuales la cookie de sesión va a estar activa. Por defecto está a 0 y por tanto la cookie de sesión durará hasta que el usuario cierre el navegador, como ya habíamos visto en Introducción a Cookies en la Web.
Es muy importante diferenciar esta variable de gc_maxlifetime. La funcionalidad degc_maxlifetime hace la resta de la hora del último acceso menos la hora actual, si el resultado en segundos es mayor que el valor de dicha variable, la sessión se borra.
Mientras que cookie_lifetime establece un tiempo de duración fijo, es decir, si se establace en 60 segundos, la sesión expirará dentro de un minuto aunque el usuario esté accediendo continuamente.
session.use_only_cookies
Esta variable establece que solamente se deben de usar cookies para gestionar las sesiones. Por defecto está activado y es importante no modificarlo. El problema de desactivarlo, es que PHP intentará gestionar las sesiones vía parámetros GET en caso de que no estén activadas las cookies en el navegador del usuario.
Esto puede llevar a problemas de seguridad y comprometer la privacidad del usuario.
Conclusión
El uso de sesiones con PHP es, como has visto, bastante sencillo, aunque se puede complicar todo lo que quieras si lo quieres gestionar tú de forma manual.
Os recomiendo que si no tenéis experiencia en el tema, probéis a experimentar hasta que entendáis bien como funciona todo, ya que mucha gente usa las sesiones pero no toda sabe como funciona, y es muy importante siempre, saber lo que está haciendo el backend a la hora de desarrollar.
Espero que os haya gustado, ¡nos vemos en el proximo artículo!
No hay comentarios:
Publicar un comentario