2012-06-17 25 views
6

Mi chiedo come PHP rilevi che una sessione specifica è scaduta.In che modo PHP rileva che una sessione è scaduta?

In dettaglio: utilizzo il gestore di sessione predefinito (basato su file), con una durata di sessione predefinita e così via. Tutto in php.ini è di default.

Se ora viene avviata una sessione, PHP esegue un controllo (in base a non session.gc_divisor e session.gc_probability) se sono presenti sessioni scadute. Ma da dove viene il tempo di accesso dell'ultima sessione di PHP alle sessioni da controllare?

Il file di sessione contiene solo il carico di lavoro, ad es. x|i:1; per un $_SESSION['x'] = 1;, quindi non ci sono informazioni sull'ultimo tempo di accesso alla sessione.

Penso che non ci siano informazioni in memoria relative agli orari di avvio della sessione poiché le sessioni continuano a funzionare dopo un riavvio completo del server.

Quindi, da dove viene ricavata l'informazione da PHP? Sta confrontando il mtime/ctime del file di sessione?

risposta

8

Il gestore di sessione predefinito di PHP memorizza i dati $ _SESSION in un file utilizzando serialize(), nella directory specificata da session.save_path. Generalmente il nome del file assomiglia a $filename = 'sess_' . session_id().

Poiché è solo un file, PHP può utilizzare il file mtime (ora dell'ultima modifica) per determinare quali file di sessione sono obsoleti. Fondamentalmente prenderà tutti i file di sessione il cui mtime supera il valore session.gc_maxlifetime e unlink(). Come hai detto, la probabilità che la pulizia si verifichi è governata dalle variabili ini session.gc_*.

Ora, se si creano i gestori di sessione personali con session_set_save_handler(), questo è tutto fuori dalla finestra e ora si ha il controllo su come le sessioni vengono archiviate e ripulite, ma ciò spiega il comportamento predefinito.

+0

Ehi, grazie per la risposta. Hai scritto "PHP può usare il file mtime". Sono abbastanza sicuro che questo è il modo in cui PHP lavora con il gestore di sessione basato su file predefinito, ma c'è qualche dichiarazione ufficiale su questo? – hacksteak25

+1

No, ma si può sempre controllare la fonte php se si vuole essere sicuri. Poiché il "time-of-last-usage" non è codificato nei dati della sessione stessa, il mtime del file di sessione è l'unico altro posto in cui tali informazioni siano disponibili. PHP non mantiene un database di mtimes altrove - se così fosse, ci sarebbero opzioni di configurazione per specificare dove/come sarebbero conservati quei dati. –

+0

sperato che ci sarebbe un modo più semplice di guardare nelle fonti;) Ma hai ragione. Non ci sono opzioni per i mtimes, quindi sembra che non ci sia altro che il file mtime. Grazie. – hacksteak25

Problemi correlati