Escribir un custom session handler es sorprendentemente fácil, pero creo que hay probablemente mejores maneras de almacenar los datos de sesión de MEMORY
tablas.
Un esquema algo así como (levantado con los cambios de a previous question)
CREATE TABLE IF NOT EXISTS `session` (
`id` char(32) NOT NULL,
`data` varchar(20000) NOT NULL,
`time_created` timestamp NOT NULL default '0000-00-00 00:00:00',
`time_updated` timestamp NOT NULL default '0000-00-00 00:00:00' on update CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `time_created` (`time_created`),
KEY `time_updated` (`time_updated`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8;
entonces lo que sólo hay que definir sus funciones de controlador de sesión, como se indica en el enlace de arriba o en este tutorial. Si desea guardar la información de su sesión durante la recolección de basura, solo tendrá que crear una tabla idéntica a la anterior usando el motor INNODB
y agregar un bit al final de la función gc()
que copia la fila de las tablas MEMORY
a INNODB
.
Sin embargo, las tablas MEMORY
tienen algunos límites bastante significativos. No pueden usar las columnas BLOB
o TEXT
- por eso tengo ese feo varchar(20000)
arriba. Tienen un tamaño máximo de 16 MB. Si tiene muchos usuarios, mantiene una gran cantidad de estado o tiene problemas con la recolección de basura, puede alcanzar ese límite y bloquearse.
Una mejor idea es utilizar memcache
session handler, especialmente si no necesita almacenar información de la sesión en un futuro lejano. Estoy bastante seguro de que memcached
es más rápido que cualquier RDBMS (incluso con tablas MEMORY
) y se adapta bien por diseño. Además, no tendrá que escribir sus propias funciones de controlador de sesión.
Es posible aumentar el tamaño máximo de la tabla ajustando la variable del sistema [max_heap_table_size] (https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_heap_table_size). –