Le sessioni secondo Drupal

Drupal Garbage

Drupal per tenere traccia delle sessioni degl utenti salva le informazioni relative ai navigatori all'interno del suo database, infatti tutti dati relativi alle sessioni vengono salvate in una tabella chimata 'session'.
Il sistema reagisce all'ingesso di un visitatore sul sito creando una nuova riga nella tabella session. La riga creata inizialmente viene generata per l'utente anonimo (UID = 0) nel momento che l'utente effettua un login la riga verrà contrassegnata con l'UID dell'utente.
Ogni navigatore che accede al nostro sito Drupal lascia quindi una traccia all'interno della nostra tabella 'session' e pertanto periodicamente il sistema deve provvedere a pulire la tabella dei dati non piu necessari altrimenti la tabella crescerebbe all'infinito con le naturali conseguenze che questo comporta.
Per default all'interno del nostro setting.php del nostro sito Drupal troviamo:

ini_set('session.cookie_lifetime',  2000000); // Circa 23 Giorni

La riga sopra configura il "Garbage Collector" (lo spazzino) di PHP a pulire le sessioni piu vecchie di 23 giorni. La pulizia viene fatta direttamente dal GC che dovrebbe essere attivo ma spesso alcune distribuzioni (es Debian, Ubuntu) o alcuni hoster (Unbit) configurano il GC come spento e pertanto il povero spazzino non è autorizzato a svuotare la tabella session e questa continua a riempirsi crescendo di fatto all'infinito.
Le righe qui sotto se aggiunte al setting.php servono ad attivare il GC nel caso la nostra istanza di PHP abbia la sfortuna di avere il GC spento.

ini_set('session.gc_probability', 1); // Probabilta che il GC parta
ini_set('session.gc_divisor', 100); // Il divisore della probabilità

L'attivazione del Garbage Collector di PHP come in altri linguaggi non è deterministica ed infatti le direttive sopra configurano la probabilità che il GC si attivi e faccia pulizia. Nello specifico i due parametri sopra impostano l'attivazione del GC con una probabilità di 1/100 all'attivazione di una nuova sessione.

Questa soluzione di default in Drupal si basa direttamente su primitive PHP ma se per motivi vari non possiamo utilizzarla( o non ci è concessa) ci sono svariate maniere per tenere sotto controllo la dimensione della taballa session.

Alternativa 1

Una prima soluzione semplice al problema è installare il modulo session_expire

Alternativa 2

Una seconda soluzione è lasciar fare al db la pulizia!!


CREATE EVENT event_db1_session_clean
ON SCHEDULE EVERY 1 DAY
DO
DELETE FROM db1.sessions WHERE timestamp UNIX_TIMESTAMP( ADDDATE( NOW( ) , INTERVAL -10 DAY ) )

Il pezzo di SQL (per MySql) di sopra crea un evento(è l'equivalente del cron di linux) che quando sarà ora eseguirà la query di pulizia della tabella, con questa soluzione la tabella tutti i giorni verrà pulita direttamente dal motore di MySql.

Alternativa 3

Una terza soluzione è uno script di 5 righe nel cron

Quando l'alternativa diventa miglioria

Come abbiamo visto sopra ci sono svariati modi di tenere sotto controllo la tabella session ma nel caso di un sito molto trafficato la soluzione di default potrebbe non essere "geniale" perchè la pulizia avviene svariate volte al giorno in momenti non predicibili stressando ulteriormente il server web del sito. Le soluzioni alternative essendo predicibili (soprattutto la 2 e la 3) possono in alcuni casi essere considerate soluzioni migliori al problema di "maintenance" della tabella session.