Quando sto creando un sito in PHP, che richiede autenticazione o in ogni caso una gestione delle sessioni, è sempre importante stabilire quanto una sessione dura, perché la cosa più fastidiosa è trovarsi buttato fuori da un sistema, solo perché ci si è allontatati dalla postazione oppure si è ricevuta una telefontata.

Dannazione!
In questo articolo spiegherò come impostare i giusti settaggi di PHP, preferibilmente nel file /etc/php5/cgi/php.ini oppure tramite il comando ini_set.
Il primo settaggio da impostare è session.cookie_lifetime, che specifica QUANTO un cookie deve durare sulla macchina del visitatore, misurato in secondi; di default è impostato a 0, che non significa per sempre, ma piuttosto fino a quando il browser non viene chiuso. Dei valori di riferimento sono: 3600 = 1 ora; 28800 = 8 ore; 86400 = un giorno.
Per impostare questo parametro, o si edita il file etc/php5/cgi/php.ini oppure si utilizza la funzione, se abilitata, ini_set(‘session.cookie_lifetime’, 3600).
Fatto questo, passiamo a session.gc_maxlifetime, che stabilisce quanto una sessione dura sul server, cioè dopo quanti secondi il nostro fido PHP butta via una sessione che non ha aggiornato dati. Il paramentro è più subdolo di quanto possa sembrare, perché una sessione creata alle 8:00, viene considerata vecchia di 10 minuti già alle 8:10 anche se l’utente continua a visitare il sito, se nessun dato dell’array $SESSION viene aggiornato, quindi sta a te stabilire da quanto considerare una sessione scaduta, se dalla sua creazione/ultimo aggiornamento reale, oppure se dall’ultima visita, in questo caso, ad esempio incremetare una variabile dummy ad ogni pagina, con il comando $SESSION['keepailve']++ dopo esserti ricordato di inizializzare keepalive alla creazione della sessione.
In ogni caso, questo parametro non andrà MAI oltre quello precedente, quindi se alzi maxlifetime, devi ricordarti di fare altrettanto con cookie_lifetime.
Inoltre, di base, in ogni sistema basato su Debian (quindi ad esempio Ubuntu), il garbage collector gira ogni 30 minuti, non più spesso, quindi non è detto che un cookie impostato per durare 2 minuti duri veramene 2 minuti, perché se il garbage collector passa e subito dopo dovrebbe scadere la sessione, scardrà solo 29 minuti più tardi, perché nessuno si accorge della scadenza se non ogni mezz’ora.
Per risolvere questo problema, bisogna modificare il file /etc/cron.d/php5 con i permessi di super utente, la prima riga non commentata, cioè che non inizia con #, dovrebbe essere circa:
09,39 * * * * root .....
Questo indica che il garbage collector gira alle 09 e alle 39 di ogni ora, per farlo girare più spesso (meno spesso non lo consiglio), basta mettere l’elenco, separato da virgole, dei minuti in cui far accadere il controllo. Ad esempio
4,9,14,19,24,29,34,39,44,49,54,59
facendo diventare la riga:
4,9,14,19,24,29,34,39,44,49,54,59 * * * * root .....
Esegue il controllo ogni 5 minuti.
(Grazie a nulll per questi dettagli e l’indagine approfondia svolta!)
Queste impostazioni che seguono teoricamente servono, ma in pratica non vengono utilizzate.
Ora veniamo al bello, da solo il parametro maxlifetime non basta, perché PHP non passa ogni istante, per fortuna del tuo server, a controllare quali sessioni buttare, altrimenti il carico diventa eccessivo, piuttosto ha una data probabilità di farlo ad ogni pagina generata. I parametri sono session.gc_probability e session.gc_divisor. Immaginiamo di averli impostati a:
session.gc_probability = 7 session.gc_divisor = 80
Bene, allora per ogni pagina visitata, PHP controllerà (o meglio lo farà il Garbage Collector, ma questo è un dettaglio) tutte le sessioni valide, con una probabilità di 7 su 80 = 7/80 = 0.0875
Io ti consiglio di lasciare le impostazioni di base, cioè rispettivamente 1 e 100, ma dipende solamente dal server e dalle pageviews del tuo sito.