Pagina principal ADODB en español

Manual de manejo de sesiones con ADODB

V4.22 15 Apr 2004 (c) 2000-2004 John Lim (jlim#natsoft.com.my)

Este programa tiene licencia dual BSD-Style y LGPL. Esto significa que lo puedes usar tanto en productos comerciales como en propietarios.

Ligas utiles de ADOdb : Download   Otros documentos

Introduccion

Almacenamos informacion del estado especifico de un usuario o cliente Web en variables de sesion. Estas variables de sesion, persisten (se conservan) durante toda la sesion, conforme el usuario navega de pagina en pagina.

Para usar variables de sesion hay que invocar session_start() al principio de la pagina Web, antes de se envien los encabezados HTTP. Entonces para acada variable que deseas mantener viva por la duracion de la sesion, se invoca session_register($variable). Por default, el manejador de sesiones usara una Cookie para mantener el control. Tambien se pueden salvar objectos o arreglos en las variables de sesion.

El metodo por omision para almacenar sesiones es almacenandolas en un archivo. Sin enbargo si tienes necesidades especiales tales como:

El manjeador de sesiones de ADOdb te proporciona la funcionalildad de almacenar la informacion de session como registros en una tabla de alguna base de datos que pueda ser compartida entre varios servidores.

Aviso Importante de Actualizacion: Desde la version ADOdb 4.05, los archivos de manejo de sesion se movieron a su propia carpeta o subdirectorio (adodb/session). Este es una nueva version del codigo escrita por Ross Smith. El codigo viejo se encuentra en adodb/session/old.

Caracteristicas del manejador de sesiones de ADOdb

Configuracion

Existen 3 archivos de manejos de sesion que se pueden usar:

adodb-session.php        : Lo normal 
adodb-session-clob.php   : Para almacenar los datos en campos CLOBs
adodb-cryptsession.php   : Para almacenar los datos cifrados en la base de datos

Ejemplos
 
    include('adodb/adodb.inc.php');
    
    $ADODB_SESSION_DRIVER='mysql';
    $ADODB_SESSION_CONNECT='localhost';
    $ADODB_SESSION_USER ='scott';
    $ADODB_SESSION_PWD ='tiger';
    $ADODB_SESSION_DB ='sessiondb';
    
    include('adodb/session/adodb-session.php');
    session_start();
    
    #
    # Variable de sesion de prueba, Lo siguiente debe actualizarse en cada recarga
    #
    $_SESSION['AVAR'] += 1;
    print "<p>\$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";

Para forzar el uso de conexiones no persistentes, llamar adodb_session_open antes de llamar
a session_start():
 
    include('adodb/adodb.inc.php');
    
    $ADODB_SESSION_DRIVER='mysql';
    $ADODB_SESSION_CONNECT='localhost';
    $ADODB_SESSION_USER ='scott';
    $ADODB_SESSION_PWD ='tiger';
    $ADODB_SESSION_DB ='sessiondb';
    
    include('adodb/session/adodb-session.php');
    adodb_sess_open(false,false,false);
    session_start();
 
Para usar sesiones cifradas, cimplemente hay que reemplzar el archivo:
 
    include('adodb/adodb.inc.php');
    
    $ADODB_SESSION_DRIVER='mysql';
    $ADODB_SESSION_CONNECT='localhost';
    $ADODB_SESSION_USER ='scott';
    $ADODB_SESSION_PWD ='tiger';
    $ADODB_SESSION_DB ='sessiondb';
    
    include('adodb/session/adodb-cryptsession.php');
    session_start();
    
Y el mismo metodo para usar adodb-session-clob.php:
 
    include('adodb/adodb.inc.php');
    
    $ADODB_SESSION_DRIVER='mysql';
    $ADODB_SESSION_CONNECT='localhost';
    $ADODB_SESSION_USER ='scott';
    $ADODB_SESSION_PWD ='tiger';
    $ADODB_SESSION_DB ='sessiondb';
    
    include('adodb/session/adodb-session-clob.php');
    session_start();
    
 

Instalacion

1. Crear esta tabla en la su base de datos (la sintaxis puede variaar dependiendo de su base de datos): create table sessions ( SESSKEY char(32) not null, EXPIRY int(11) unsigned not null, EXPIREREF varchar(64), DATA text not null, primary key (sesskey) ); Para usar la version adodb-session-clob.php, crear la tabla de esta forma: create table sessions ( SESSKEY char(32) not null, EXPIRY int(11) unsigned not null, EXPIREREF varchar(64), DATA CLOB, primary key (sesskey) ); 2. Ahora hay que definir los siguientes parametros. Se puede modificar el archivo a incluir o definir los valores antes de incluirlo: $ADODB_SESSION_DRIVER='driver de base de datos, ej. mysql o ibase'; $ADODB_SESSION_CONNECT='servidor a conectarse'; $ADODB_SESSION_USER ='usuario'; $ADODB_SESSION_PWD ='password'; $ADODB_SESSION_DB ='base de datos'; $ADODB_SESSION_TBL = 'sessions'; # Se puede omitir esta variable Cuando se crea la secion, la variable $ADODB_SESS_CONN contiene el objeto de conexion. 3. Se recomienda la version 4.0.6 o posterior de PHP. Existen varias fallas documentadas de manejo de sesiones en versiones anteriores de PHP.

Notificaciones

Si se quieren recibir notificaciones cuando una sesion expire, entonces hay que etiquetar el registro de la sesion con la etiqueta EXPIREREF (ver la definicion de la tabla arriba). Antes de que cualquier registro de sesion sea borrado, ADOdb invocara a la funcion de notificacion, pasando el parametro indicado en EXPIREREF.

Cuando al principio se crea la sesion, se verifica la variable global $ADODB_SESSION_EXPIRE_NOTIFY. Esta es un arreglo de 2 elementos, el primero es el nombre la variable de sesion que se desea almacenar en el campo EXPIREREF, y el segundo campo es el nombre de la funcion de notificacion.

Supongamos que queremos ser notificados cuando la sesion de un usuario expire, basados en su clave de usuario (userid). La clave de usuario esta en la variable de sesion global $USERID. El nombre de la funcion es 'NotifyFn'. Entonces definimos:

 
        $ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');
    
Y cuando la funcion NotifyFn sea llamada (cuando la sesion expire), pasamos $USERID como el primer parametro, es decir NotifyFn($USERID, $sesskey). La llave de la sesion (que es la llave primaria del registro en la tabla 'sessions') es el segundo parametro.

Este es un ejemplo de una funcion de notificacion que borra algunos registros en la base de datos y algunos archivos temporales:


        function NotifyFn($expireref, $sesskey)
        {
        global $ADODB_SESS_CONN; # the session connection object

          $user = $ADODB_SESS_CONN->qstr($expireref);
          $ADODB_SESS_CONN->Execute("delete from shopping_cart where user=$user");
          system("rm /work/tmpfiles/$expireref/*");
        }
    

NOTA 1: Si esta desabilitado 'register_globals' en el archivo php.ini, entonces es necesario asignar manualmente EXPIREREF. Es decir:

 
	    $GLOBALS['USERID'] =& $_SESSION['USERID'];
        $ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');
    

NOTE 2: Si desea cambiar el valor de EXPIREREF despues de que se creo el registro de la sesion, necesita modificar cualquier variable de sesion para forzar la escritura del registro en la base de datos.

Trucos finos de notificacion

ExpireRef normalemente continene el identificador de usuario de la sesion actual.

1. Se puede escribir un monitor de sesiones, explorando expireref para ver quien esta actualmente conectado.

2. Si se borra el registro de sesion de un usuario especifico, por ejemplo:

delete from sessions where expireref = '$USER'
entonces el usuario es desactivado. Es util para expulsar a algunos del sistema.

3. Se puede explorar la tabla de sesiones para asegurarse que ningun usuario se active dos veces. Util por razones de seguridad.

Esquemas de Compresion/Cifrado

Gracias a Ross Smith desde la version 4.05 de ADOdb se soportan multiples esquemas de compresion y cifrado. Actualmente se soportan:
  MD5Crypt (crypt.inc.php)
  MCrypt
  Secure (Emulacion de Horde de MCrypt, si el modulo MCrypt no esta disponible.)
  GZip
  BZip2
Estos son apilables. por ejemplo:
ADODB_Session::filter(new ADODB_Compress_Bzip2());
ADODB_Session::filter(new ADODB_Encrypt_MD5());
comprimira y luego cifrara el registro en la base de datos.

Tambien ve la documentacion basica de ADOdb.