Pagina principal ADODB en español

Manual de administracion de sesiones con ADODB Version 2

V4.92 29 Aug 2006 (c) 2000-2006 John Lim (jlim#natsoft.com.my)

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

Ligas utiles de ADOdb : Download   Otros documentos

Introduccion

Este documento trata sobre la nueva version del manajeador de sesiones adodb-session2.php. Si tu has usado la version anterior adodb-session.php, entonces ten en cuenta que necesitas modificar el formato de tu tabla de sesiones. De no ser por ese cambio, todo tiene compatibilidad previa. Aqui podra ver el documento antiguode adodb-session.php.

Porque almacenar las variables de sesion en una base de datos?

Almacenamos informacion de estado especifica al usuario o cliente web en variables de sesion. Estas variables de sesion se mantienen durante toda la sesio conforme el usuario se mueve de pagina en pagina.

Para usar variables de sesion, llama session_start() alprincipio de tupagina web, antes de enviar cabeceras HTTP (o cualquier texto). Entonces para variable que tu quieras que viva durante toda la sesion, llama session_register($variable_name). Por omision, el manjeador de sesion lleva la informacion de la sesion usando 'cookies'. Tambien se pueden almacenar objetos o arreglos en variables de sesion.

El metodo por omision para almacenar sesiones es guardandolaes en un archivo. Sin embargo si tienes necesidades especiales como:

El manejador de sesion de ADOdb te proporciona las facilidades anteriores al almacenar la informacion de sesion como registros de una tabla de base de datos que puede ser compartida por varios servidores.

Estos registros seran procesados por el 'recolector de basura' en base a las reglas de tiempo de expiracion de sesion del archivo php.ini. Tambien puedes indicar una funcion de notificacion que te avise cuando un registro ha expirado y esta a punto de ser liberado por el recolector de basura.

Una alternativa al uso de sesiones en bases de datos es el uso de memcached. Esto es una sistema de memoria intermedia distribuida basada en memoria RAM que puede ser usada para almacenar informacion de sesion.

El manjeador de sesiones mejorado

En ka version ADOdb 4.91, agregamos un nuevo manjeador de sesion en el archivo adodb-session2.php. Incluye la siguientes mejoras:

El uso es

include_once("adodb/session/adodb-session2.php");
ADOdb_Session::config($driver, $host, $user, $password, $database,$options=false);
session_start();

#
# Prueba de variable de sesion, se debe de incremetar en cada recarga
#
$_SESSION['AVAR'] += 1;
print "<p>\$_SESSION['AVAR']={$_SESSION['AVAR']}</p>";

Cuando se crea la sesion con session_start( ), la variable global $ADODB_SESS_CONN contiene el objecto de conexion.

El nombre por omision de la tabla es sessions2. Si quieres modificarlo usa:

include_once("adodb/session/adodb-session2.php");
$options['table'] = 'mitabla';
ADOdb_Session::config($driver, $host, $user, $password, $database,$options);
session_start();

Caracteristicas del manejador de sesiones de ADOdb

Archivos del Manejador de Sesion

Existen 3 archivos disponibles para el manejo de sesiones:

adodb-session2.php        : El archivo normal
adodb-cryptsession2.php : Usa este archivo si quieres almacenar la informacion encripitada en la base de datos
adodb-session-clob2.php : Usa este para almacenar la informacion en CLOBs y NO estas usando el driver de oci8.

Ejemplos de uso

Para forzar el uso de conexiones no persistentes, llama Persist() antes de session_start():

 
include_once("adodb/session/adodb-session2.php");
$driver = 'mysql'; $host = 'localhost'; $user = 'auser'; $pwd = 'secret'; $database = 'sessiondb';
ADOdb_Session::config($driver, $host, $user, $password, $database,$options=false);
ADOdb_session::Persist($connectMode=false);
session_start();

El parametro al metodo Persist( ) indica el modo de conexion. Los argumentos puede ser:

$connectMode Metodo de Conexion
true

PConnect( )

false Connect( )
'N' NConnect( )
'P' PConnect( )
'C' Connect( )

Para usar sesiones encriptadas, simplemente reemplaza el archivo adodb-session2.php:

 
include('adodb/session/adodb-cryptsession2.php');

$driver = 'mysql'; $host = 'localhost'; $user = 'auser'; $pwd = 'secret'; $database = 'sessiondb'; ADOdb_Session::config($driver, $host, $user, $password, $database,$options=false);
adodb_sess_open(false,false,$connectMode=false);
session_start();

Y la misma tecnica pata adodb-session-clob2.php:

  
include('adodb/session/adodb-session2-clob2.php');
$driver = 'oci8'; $host = 'localhost'; $user = 'auser'; $pwd = 'secret'; $database = 'sessiondb'; ADOdb_Session::config($driver, $host, $user, $password, $database,$options=false);
adodb_sess_open(false,false,$connectMode=false);
session_start();

Instalacion

1. Crea esta tabla en tu base de datos. Aqui esta la version para MySQL:

  
CREATE TABLE sessions2(
	  sesskey VARCHAR( 64 ) NOT NULL DEFAULT '',
  	  expiry DATETIME NOT NULL ,
	  expireref VARCHAR( 250 ) DEFAULT '',
	  created DATETIME NOT NULL ,
	  modified DATETIME NOT NULL ,
	  sessdata LONGTEXT DEFAULT '',
	  PRIMARY KEY ( sesskey ) ,
	  INDEX sess2_expiry( expiry ),
	  INDEX sess2_expireref( expireref )
)

Para PostgreSQL, usa:

CREATE TABLE sessions2(
 sesskey VARCHAR( 64 ) NOT NULL DEFAULT '',
 expiry TIMESTAMP NOT NULL ,
 expireref VARCHAR( 250 ) DEFAULT '',
 created TIMESTAMP NOT NULL ,
 modified TIMESTAMP NOT NULL ,
 sessdata TEXT DEFAULT '',
 PRIMARY KEY ( sesskey )
 );
create INDEX sess2_expiry on sessions2( expiry );
create INDEX sess2_expireref on sessions2 ( expireref );

Esta es la definicion para Oracle, la cual usa a CLOB para el campo SESSDATA:

  CREATE TABLE SESSIONS2
(
SESSKEY VARCHAR2(48 BYTE) NOT NULL,
EXPIRY DATE NOT NULL,
EXPIREREF VARCHAR2(200 BYTE),
CREATED DATE NOT NULL,
MODIFIED DATE NOT NULL,
SESSDATA CLOB,
PRIMARY KEY(SESSKEY)
);
CREATE INDEX SESS2_EXPIRY ON SESSIONS2(EXPIRY); CREATE INDEX SESS2_EXPIREREF ON SESSIONS2(EXPIREREF);

Necesitamos usar CLOB debido a que textos mayores de 4000 bytes de largo, Oracle requiere que uses el tipo de dato CLOB. Si usas el driver oci8, ADOdb habilitara automaticamente el manejo de CLOBs. En este caso puedes usar adodb-session2.php o adodb-session-clob2.php indistintamente.

Notificaciones

Puedes recibir notificaciones cunaod tu sesion sea procesada por el recolector de basura de sesion o cuando inviques session_destroy().

La extension de sesiones de PHP ejecutara automaticamente una funcion especial de recoleccion de basura (GC) segun diga los parametros session.cookie_lifetime y session.gc_probability del archivo php.ini. Esta en su momento llamara a la funcion de ADOdb de recolecion de basura (GC) que puede ser configurada a que haga la notificacion.

    PHP Session --> ADOdb Session  --> Busca los      --> Envia         --> Borra los
    Funcion GC      Funcion GC         registros a        notificacion      registros
    ejecutada en    ejecutada por      ser borrados       para c/registro
    cualquier       la extension de                       a ser borrado
    momento         sesiones

Cuando se crea una sesion, necesitamos almacenar un valor en el registro de sesion (en el campo EXPIREREF), usualmente el nombre de usuario de la sesion. Posteriormente cuando la sesion exppira, justo antes de que se borre el registro, recargamos el campo EXPIREREF e invocamos la funcion de notificacion con el valor de EXPIREREF, el cual es valor del usuario de la persona a ser desconectada.

ADOdb emplea la variable global $ADODB_SESSION_EXPIRE_NOTIFY que debes de predefinir antes de que inie la sesion para almacenar la configuracion de notificacion. $ADODB_SESSION_EXPIRE_NOTIFY es un arreglo con 2 elementos, el primero es el nombre de la variable de sesion que quieres almacener en el campo EXPIREREF, y el segundo es el nombre de la funcion de notificacion.

Por ejemplo, supongamos que queremos ser notificados cuando la sesion del usuario expire, basados en su clave de usuario. Cuando el usuario se conecta almacenamos su identificador en la variable de sesion $USERID. El nombre de la funcion es 'NotifyFn'.

Entonces definimos (antes de llamar a session_start() ):

 
	$ADODB_SESSION_EXPIRE_NOTIFY = array('USERID','NotifyFn');
Y cuando se invoque la funcion NotifyFn (cuando expire la sesion), el valor de $USERID es enviado como primer parametro, ej. NotifyFn($userid, $sesskey). La llave de la sesion (el cual es la llave primaria del registro en la tabla de sesiones) es el segundo parametro.

Aqui un ejemplo de una funcion de notificacion que borra algunos registros en la b ase de datos y 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 carro_de_compras where usuario=$user");          
		system("rm /work/tmpfiles/$expireref/*");
	}  
			  

NOTA 1: Si tienes desactivado register_globals en el php.ini, entonces tendras que poner manualmente el valor de EXPIREREF. Ej.

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

NOTA 2: Si tu quieres cambiar el valor de EXPIREREF despues de que el registro de sesion haya sido creado, deberas modificar cualuier variable de sesion para provocar que se actualice el registro en la base de datos.

Trucos ingeniosos de notificacion

ExpireRef normalmente contiene la clave de usuario de la sesion actual.

1. You can then write a session monitor, scanning expireref to see who is currently logged on.

2. If you delete the sessions record for a specific user, eg.

delete from sessions where expireref = '$USER'
entonces el usuario es desconectado. Es util para expulsar a personas del sitio.

3. You can scan the sessions table to ensure no user can be logged in twice. Useful for security reasons.

Compression/Encryption Schemes

Since ADOdb 4.05, thanks to Ross Smith, multiple encryption and compression schemes are supported. Currently, supported are:

  MD5Crypt (crypt.inc.php)
MCrypt
Secure (Horde's emulation of MCrypt, if MCrypt module is not available.)
GZip
BZip2

These are stackable. E.g.

ADODB_Session::filter(new ADODB_Compress_Bzip2());
ADODB_Session::filter(new ADODB_Encrypt_MD5());
will compress and then encrypt the record in the database.

Session Cookie Regeneration: adodb_session_regenerate_id()

Dynamically change the current session id with a newly generated one and update database. Currently only works with cookies. Useful to improve security by reducing the risk of session-hijacking. See this article on Session Fixation for more info on the theory behind this feature. Usage:

	include('path/to/adodb/session/adodb-session2.php');
	
	session_start();
	# Approximately every 10 page loads, reset cookie for safety.
	# This is extremely simplistic example, better 
	# to regenerate only when the user logs in or changes
	# user privilege levels.
	if ((rand()%10) == 0) adodb_session_regenerate_id(); 

This function calls session_regenerate_id() internally or simulates it if the function does not exist.

Vacuum/Optimize Database

During session garbage collection, if postgresql is detected, ADOdb can be set to run VACUUM. If mysql is detected, then optimize database could be called.You can turn this on or off using:

$turnOn = true; # or false
ADODB_Session::optimize($turnOn);

The default is optimization is disabled.

Backwards Compatability

The older method of connecting to ADOdb using global variables is still supported:

 $ADODB_SESSION_DRIVER='mysql';
 $ADODB_SESSION_CONNECT='localhost';
 $ADODB_SESSION_USER ='root';
 $ADODB_SESSION_PWD ='abc';
 $ADODB_SESSION_DB ='phplens';
 
 include('path/to/adodb/session/adodb-session2.php'); 

In the above example, the only things you need to change in your code to upgrade is

More Info

Also see the core ADOdb documentation. And if you are interested in the obsolete adodb-session.php, see old session documentation.