En este artículo analizaremos de forma profunda las sesiones web, desde su definición hasta su uso y configuración en PHP. Si todavía no tienes qué son, cómo funcionan y para qué sirven… este tutorial te será de gran ayuda. ¡No te lo pierdas!

Autor:

Intentando mejorar cada día en este mundo tan cambiante de la programación. Sígueme en Twitter o en GitHub. Actualmente estoy disponible para contratar.

¿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 como Session 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 de gc_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!

¿Necesitas desarrollar un proyecto web o para móviles? ¡Estamos disponibles!

Visitar Cokidoo

Cokidoo, los creadores de Ontuts, desarrollamos proyectos tecnológicos centrados en redes sociales y aplicaciones web, aplicaciones móviles y consultoría web y bases de datos.

Somos jóvenes, inquietos, versátiles, apasionados por la innovación y enfocados en las nuevas tecnologías. Con Ontuts tratamos de compartir nuestro conocimiento adquirido en los distintos proyectos, ayudando a la comunidad y mostrando nuestra capacidad tecnológica.

Si necesitas un presupuesto sin compromiso, estamos disponibles, no dudes en contactar con nosotros.

Comentarios en esta publicación (15 comentarios)

¿Te ha gustado esta publicación? ¡Puedes compartir tu opinión con todos nosotros! Simplemente pincha aquí mismo.

Reedyseth

Excelente artículo, sobre todo el uso de manejadores. Con este tipo de post puedes aumentar mas tu conocimiento ;-)

Fantastico me ha venido genial, gracias!

Gracias a ti Alex por ser tan fiel a Ontuts ;)

Hola,

He escuchado que el uso de sesiones puede llevar a fallas de seguridad, ¿tu sabes que tan cierto es esto?

Gracias,

Hola Cesar Castro,

El uso de sesiones puede llevar a fallos de seguridad, al igual que cual código que hagas, sea de lo que sea. Pero para nada se puede decir que sea peligroso o que comprometa la seguridad de tu sitio el uso de Sesiones.

Un saludo.

hola, intersante y muy completo gracias!

knives

Me has ayudado, he emepzado recientemente a aprender algo de php y hoy en dia las sesiones son basicas,
Muchas gracias!

Marco

pregunto: ¿puedo de alguna manera en php saber/conocer/mirar/leer todas las sessiones que estan activas en un determinado momento?
Para que se entienda la pregunta, seria como para querer mostrar en base a las sessiones encontradas en el server, cuantos usuarios hay a la vez en el sitio. (Se que esto se debe hacer de otra manera, pero es solo grafico para que entiendan lo que quiero)

Mil gracias

Hola Marco,

Lo que se me ocurre es que PHP guarda las sesiones en ficheros dentro del directorio espeficicado en la configuración mediante la variavle session_save_path.

Podrías contar el número de ficheros que hay en ese directorio, pero como bien dices, no sería fiable.

Hola este es mi primer comentario aqui, primeramente me gustan mucho sus tutoriales, les agradesco por tomarce el tiempo para compartir sus conocimientos con los desarrolladores que apenas vamos empezando…

Solo tengo una pregunta con respecto a las sessiones, ¿Cómo puedo hacer para alargar el tiempo de vida de una session? por ejemplo:

un usuario se logea en un sitio y esta capturando información, pero en eso, deja la aplicación y se pone a twitear XD por un buen rato, y cuando regresa a la aplicación su session ha expirado, y al momento de querer guardar la información capturada le arroja un error de mysql, por que se ha perdido la conexion.

¿se puede hacer que una session expirada vuelva “despertar”?
un saludo y gracias de antemano…

Flowers

Hola a todos…..al parecer tengo el mismo problema que “dhamasito”….lo lograste resolver?? puedes compartir de que manera lo lograste??

Gracias de antemano!

Hola Flowers, creo que el foro esta muerto desde hace un buen rato, con respecto a lo que preguntas la verdad es que no he logrado eso, y he leido por ahy que por cuestiones de seguridad es recomendable que la session caduque.

lo que puedes hacer es algo como esto:

class Session {
public function __construct() {
ini_set(‘session.use_only_cookies’, 1); // usar cookies
ini_set(‘session.use_trans_sid’, 0); // denegar propagar el sid por la url
ini_set(‘session.gc_maxlifetime’, 1440); // tiempo en que quieres que expire tu session (segundos)
ini_set(‘session.gc_probability’, 1); // manejar la probabilidad del recolecctor de basura
ini_set(‘session.gc_divisor’, 1000); // complemento del anterior
session_start();
}
}

luego en tu archivo incluyes la clase:
include ‘../classes/Session.class.php’;
$objSession = new Session();

Lo unico que tendrias que hacer es modificar session.gc_maxlifetime.

Hola Iván:
Me gustaría que me ayudaras en el error de sesión que tengo en mi web, la he colgado hace poco y la verdad es que en el servidor local (localhost Apache Wamp) me funciona perfectamente, pero en la red no.
He andado por un montón de foros y la mayoría coinciden en no dejar espacios, en cambiar el UTF-8, en poner la sesión al principio del código, etc, pero nada me funciona.
El código lo crea Dreamweaver y lo pone en el mismo sitio, cuando lo cambio para ponerlo al principio me deja de funcionar. Aquí te pongo el código a ver qué se puede hacer:

= 5.1) {session_regenerate_id(true);} else {session_regenerate_id();}
//declare two session variables and assign them
$_SESSION['MM_Username'] = $loginUsername;
$_SESSION['MM_UserGroup'] = $loginStrGroup;

if (isset($_SESSION['PrevUrl']) && false) {
$MM_redirectLoginSuccess = $_SESSION['PrevUrl'];
}
header(“Location: ” . $MM_redirectLoginSuccess );
}
else {
header(“Location: “. $MM_redirectLoginFailed );
}
}
?>

Gracias, te dejo el enlace de la web para que veas qué pasa cuando intentas entrar como usuario registrado.
Un saludo

Hola Melchor,

Revisa el fichero /htdocs/Connections/conexion1.php en la línea 2 parece que envías algun texto al buffer de salida, de ahí el error.

Comprueba que no existan saltos de linea antes de abrir las etiquetas

Un saludo

Talarana

Freely permitted everybody!