11 de febrero de 2009
Normalmente, cuando hago el análisis de la base de datos para un proyecto nuevo, incorporo una tabla que será la encargada de gestionar las sesiones de los usuarios de la web. Cuando el proyecto va a constar de aplicación frontend y aplicación backend intento separar sus sesiones en tablas diferentes: public_sesion_db y private_sesion_db.
La estructura de estas tablas es la siguiente:
id: varchar(40)
data: text
time: datetime
La clase que uso en los proyectos symfony para la gestión de las sesiones es sfMySQLSessionStorage. Para cerciorarnos de que las tablas de sesiones no almacenan datos de por vida, y así asegurarnos de no tener problemas con las id's (que estas no se pisen, o sean leidas de forma incorrecta), la clase incorpora un mí©todo llamado sessionGC que ejecuta la siguiente consulta SQL:
'DELETE FROM '.$db_table.' '.'WHERE '.$db_time_col.' + INTERVAL '.$lifetime.' SECOND < NOW()' donde:
¿ Cuándo se llama a este mí©todo ?
Este mí©todo es llamado mediante una probabilidad (que se calcula a partir de unos parámetros configurados en el archivo php.ini del servidor) que se aplica a cada visita a la web, es decir, por cada petición que se hace a la web se decide si se llama al recolector de basura (depende de la probabilidad).
Los parámetros encargados de calcular esa probabilidad son:
la probabilidad es session.gc_probability / session.gc_divisor. El valor del divisor ha de ser modificado en función del número de usuarios de la web, para que se llame un par de veces diarias al mí©todo sessionGC.