LXXII. Funciones para la Gestión de Sesiones

El soporte de sesiones en PHP es básicamente un sistema que preserva ciertos datos en una serie de accesos. Esto permite construir aplicaciones más personalizadas e incrementar el atractivo de un website.

Si ya está familiarizado con la gestión de sesión de PHPLIB, apreciará que algunos conceptos son similares al soporte de sesiones de PHP.

A cada visitante que acceda a su web se le asigan un único id, el conocido id de sesión.Éste se almacena en una cookie del usuario o bien se propaga con la URL.

El soporte de sesión le permite transportar tantas variables como desee a través de las solicitudes del cliente. Cuando un visitante accede a su web, PHP chequea automáticamente (si session.auto_start está puesta a 1), manualmente (si añade el comando session_start()) o implicitamente (al añadir session_register()) si se ha establecido una sesión concreta con la llamada. Si es así, el entorno grabado es reproducido.

Todas las variables registradas son serializadas tras finalizar la solicitud. Las variables registradas que no estén definidas se marcan como no definidas. En los accesos posteriores, estas variables no las define el módulo de sisión, a no ser que las defina el usuario después.

Los parámetros de configuración track_vars y gpc_globals influyen en como se recuperan las variables de sesión. Si track_vars está activado, las variables recuperadas estarán guardadas en la matriz asociativa $HTTP_STATE_VARS. Si gpc_globals está activado, las variables de sesión se recuperarán como variables globales. Si ambos parámetros están activados, las variables globales y los registros de $HTTP_STATE_VARS valdrán lo mismo.

Hay dos formas de propagar un id de sesión:

  • Cookies

  • parámetros URL

El módulo de sesión soporta ambos métodos. Las Cookies son ideales, pero como su permanencia no la controla el servidor, sino el cliente no nos podemos fiar. El segundo método integra el id de sesión en las URLs.

PHP es capaz de hacer esto de forma trasparente cuando se ha compilado con --enable-trans-sid. Si activa esta opción las URIs relativas se cambiarán automáticamente para contener el id de sesión. Otra posibilidad es usar la constante SID siempre definida, si el cliente no manda la cookie apropiada. SID es de la forma session_name=session_id o bien es una cadena vacía.

El siguiente ejemplo muestra como registrar una variable y como enlazarla correctamente a otra página usando SID.

Ejemplo 1. Contando el número de hits en un usuario sencillo


<?php

session_register("count");

$count++;

?>

Hola, visitante, has visto esta página <? echo $count; ?> veces.<p>

<?
# el <?=SID?> es necesario para preservar el id de la sesión
# para el caso en que el usuario haya descativado las Cookies
?>

 Para continuar, <A HREF="nextpage.php?<?=SID?>">pulse aquí</A>

Para implementar el almacenamiento en base de datos necesita código PHP y la función a nivel de usuario session_set_save_handler(). Tendría que extender las siguientes funciones para soportar MySQL y otras bases de datos.

Ejemplo 2. Manejo de session_set_save_handler()


<?php

function open ($save_path, $session_name) {
    echo "open ($save_path, $session_name)\n";
    return true;
}

function close () {
    echo "close\n";
    return true;
}

function read ($key) {
    echo "write ($key, $val)\n";
    return "foo|i:1;";
}

function write ($key, $val) {
    echo "write ($key, $val)\n";
    return true;
}

function destroy ($key)
    return true;
}

function gc ($maxlifetime) {
    return true;
}

session_set_save_handler ("open", "close", "read", "write", "destroy", "gc");

session_start ();

$foo++;

?>
     

Producirá los siguientes resultados:


$ ./php save_handler.php
Content-Type: text/html
Set-cookie: PHPSESSID=f08b925af0ecb52bdd2de97d95cdbe6b

open (/tmp, PHPSESSID)
read (f08b925af0ecb52bdd2de97d95cdbe6b)
write (f08b925af0ecb52bdd2de97d95cdbe6b, foo|i:2;)
close
    

El <?=SID?> no es necesario, si --enable-trans-sid se usó para compilar PHP.

El sistema gestor de sesiones soporta una serie de opciones de configuración que puede poner en su fichero php.ini. Las vemos a continuación.

  • session.save_handler define el nombre del handler que se usa para almacenar y recuperar los datos asociados con la sesión. Por defecto es files.

  • session.save_path define el argumento que se pasa al handler de grabación. Si escoge el handler por defecto, éste es el path donde los ficheros son creados. Por defecto es /tmp.

  • session.name especifica el nombre de la sesión el cual se usa como nombre de la cookie. Debe contener sólo caracteres alfanuméricos. Por defecto es PHPSESSID.

  • session.auto_start especifica si el módulo de sesión inicia automáticamente una sesión en la solicitud inicial. Por defecto es 0 (disabled).

  • session.lifetime especifica el tiempo de vida de una cookie en segundos que se le envía al navegador. El valor 0 significa "hasta que se cierre el navegador". Por defecto es 0.

  • session.serialize_handler define el nombre del handler que se usa para serializr/deserializar datos. Actualmente, están soportados un formato interno de PHP (con nombre php) y WDDX (con nombre wddx). WDDX sólo está disponible si se compila PHP con WDDX support. Por defecto es php.

  • session.gc_probability especifica la probabilidad en tanto por cien de que la rutina de gc (garbage collection) se en cada solicitud. Por defecto es 1.

  • session.gc_maxlifetime especifica el número de segundos después de los cuales los datos son considerados como 'basura' y por tanto limpiados mediante gc.

  • session.referer_check determina si los ids de sesión referidos a sitios externos son eliminados. Si los ids de sesión se propagan usando el método de URL los usuarios que no conocen sus implicaciones podrían exponer sin querer los ids de sesión. Esto podría generar problemas de seguridad, que este chequeo trata de eliminar. Por defecto es 0.

  • session.entropy_file da una ruta a un recurso externo (un fichero) que se usará como fuente adicional de entropía en la creación del id de sesión. Un ejemplo sería /dev/random o bien /dev/urandom que están disponibles en muchos sistemas Unix.

  • session.entropy_length especifica el número de bytes que se leerán del fichero arriba indicado. Por defecto es 0(desactivado).

  • session.use_cookies especifica si el módulo usará cookies para almacenar el id de sesión en el lado del cliente. Por defecto es 1 (activado).

Nota: La gestión de sesiones se añadió en PHP 4.0.

Tabla de contenidos
session_start — Inicializa las variables de sesión
session_destroy — Elimina toda la información registrada en una sesión
session_name — Obtiene y/o establece el nombre de la sesión en curso
session_module_name — Obtiene y/o establece el módulo de sesión en curso
session_save_path — Obtiene o establece el path de grabación de la sesión en curso
session_id — Obtiene o establece el id de sesión en curso
session_register — Registra una o más variables en la sesión en curso
session_unregister — Desliga una variable de la sesión en curso
session_is_registered — Aveigua si una variable está registrada en una sesión
session_decode — Extrae los datos de sesión a partir de una cadena
session_encode — Codifica los datos de la sesión en curso en una cadena