Scrivi custom session handler è sorprendentemente facile, ma penso che ci sono modi probabilmente meglio per memorizzare i dati della sessione di MEMORY
tabelle.
Uno schema qualcosa di simile (sollevato con le modifiche da 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;
allora si era appena devono definire le funzioni di gestione delle sessioni, come indicato nel link qui sopra o in questo tutorial. Se si desidera salvare le informazioni sulla sessione durante la garbage collection, è sufficiente creare una tabella identica a quella sopra utilizzando il motore INNODB
e aggiungere un bit alla fine della funzione gc()
che copia la riga dalle tabelle MEMORY
a INNODB
.
Tuttavia le tabelle MEMORY
presentano dei limiti piuttosto significativi. Non possono usare le colonne BLOB
o TEXT
- ecco perché ho quel brutto varchar(20000)
sopra. Hanno una dimensione massima di 16 MB. Se hai un sacco di utenti, tieni un sacco di stato, o hai problemi con la garbage collection puoi raggiungere quel limite e andare in crash.
Un'idea migliore è utilizzare memcache
session handler, soprattutto se non è necessario memorizzare le informazioni di sessione nel lontano futuro. Sono abbastanza sicuro che lo memcached
sia più veloce di qualsiasi RDBMS (anche con le tabelle MEMORY
) e si adatta bene alla progettazione. Inoltre non dovrai scrivere le tue funzioni di gestore di sessione.
È possibile aumentare la dimensione massima della tabella modificando la variabile di sistema [max_heap_table_size] (https://dev.mysql.com/doc/refman/5.5/en/server-saria-variables.html#sysvar_max_heap_table_size). –