Ho problemi con il sito PHP Eseguo al lavoro dove gli utenti vengono disconnessi dopo alcuni minuti (l'ora esatta varia, ma è abbastanza frequente da essere un problema), indipendentemente dal fatto che hanno usato attivamente il sito o no.Le sessioni PHP scadono presto
Il problema è che non riesco a riprodurre questo problema, se accedo come utenti con lo stesso browser non riesco a disconnettermi, il che suggerisce che non si tratta di una rottura completa del sito. Purtroppo non ho accesso ai computer degli utenti per eseguire alcun software di sniffing del traffico.
Le cose che ho già controllato sono:
- chiedendo agli utenti di provare i vari browser. Ciò non sembra risolvere il problema e non è comunque una soluzione a lungo termine, in quanto non è possibile dettare quali browser utilizzeranno i clienti.
- L'ora del server è corretta e in linea con le macchine dell'utente.
- L'utente Apache viene eseguito come autorizzato a scrivere nella cartella della sessione e posso vedere i file di sessione creati e i loro tempi di modifica aggiornati.
- Non vengono utilizzate funzioni di buffer di output.
- Il problema sta accadendo su una varietà di pagine che sembrano non avere nulla in comune (cioè non è che tutti usano AJAX, o aggiornano il database o qualche altro motivo).
- Gli utenti accedono al loro account solo da una macchina, ovvero non lavorano un po 'sul portatile, passano al desktop e si domandano perché sono stati disconnessi dal loro laptop (non permettiamo più login simultanei per lo stesso utente).
Le impostazioni di sessione in PHP sono le impostazioni predefinite di Debian e non sono state modificate in un file .htaccess o altrove. I principali sono:
session.cookie_lifetime 0
session.gc_divisor 100
session.gc_maxlifetime 1440
session.gc_probability 0
session.save_handler files
session.save_path /var/lib/php5
session.use_cookies On
Debian cancella sessioni attraverso un processo di cron, invece di utilizzare garbage collector di PHP, che è il motivo per cui gc_probability è impostato a 0. La versione di PHP stiamo correndo è: PHP 5.2.6-1 + lenny13 con Suhosin-Patch 0.9.6.2 (cli) (ultima versione di Lenny, aggiorneremo presto Squeeze ma non penso che sia la causa del problema).
Utilizziamo Zend_Session per gestire le sessioni e un'istanza di Zend_Session_Namespace viene creata una volta su ogni pagina, chiamando quindi automaticamente session_start(). Le sessioni sono cancellati chiamando Zend_Session :: destroy() nella pagina di logout, quindi gli unici modi in cui un utente deve essere registrato fuori sono:
- Se si fa clic esplicitamente il link di logout (abbiamo registro quando questo accade e doesn Sembra che il browsing stia precompilando la pagina e quindi effettui il logout dell'utente.
- Se lascia la sessione inattiva per più di 24 minuti, a quel punto Debian probabilmente cancellerà la propria sessione (c'è un cron job che viene eseguito ogni mezz'ora eliminando tutte le sessioni che non sono state modificate per oltre 24 minuti).
- Se chiudono il browser, il loro cookie di sessione con una scadenza pari a 0 verrà cancellato.
I controlli per vedere se un utente è connesso in sono:
- Hanno una sessione valida (controllato da vedere se siamo in grado di accedere a $ zsession-> user_id).
- C'è una riga nella tabella delle sessioni che ha un ID utente e un ID sessione corrispondenti e questo è stato aggiornato l'ultima volta meno di un'ora fa. Cancelliamo questa riga al logout in modo che nessuno possa accedere a tale account senza accedere.
Qualcuno può suggerire altre cose che posso provare?
Edit: Alcune cose aggiuntive che ho provato sulla base dei commenti rimasto:
- Impostazione session.cookie_domain: Questo sembra avere un comportamento molto strano in PHP. Se non imposto questa variabile e la lasciamo come predefinita di '' (stringa vuota), allora una richiesta per www.domain.com produrrà un cookie di www.dominio.com. Tuttavia, se imposto cookie_domain su "www.dominio.com", il dominio per il cookie è ".www.dominio.com" (nota punto iniziale, che significa valido per tutto ciò che si trova sotto www.domain.com, ad esempio sito secondario.www .dominio.com).
- Impostazione session.cookie_lifetime: PHP non sembra aggiornare il tempo di scadenza su ogni richiesta, quindi se imposto cookie_lifetime a 3600 il cookie scadrà un'ora dopo che l'utente visita per la prima volta il sito, anche se l'accesso e l'utilizzo costante .
Edit 2: Sulla base di altre cose persone hanno chiesto:
- Il sito è ospitato in un data center, in una VLAN separata. Nessuno che accede al sito si trova sulla stessa rete del sito.
- Non è utilizzata l'autenticazione IP, né l'indirizzo IP del client utilizzato in alcuna parte del processo di sessione (ad esempio, non associamo la sessione a un indirizzo IP e blocchiamo l'utente se la successiva richiesta proviene da un IP diverso).
L'ultima volta che ho avuto un problema simile, mi mancava di gestire correttamente le sessioni in un certo file php (tutti gli altri file erano ok). Il risultato è stato che la sessione è diventata invalida dopo che l'utente ha tentato di uscire da quella determinata pagina in modo da essere disconnesso dopo diversi minuti a seconda di quando ha navigato sulla pagina. Non vederlo come una soluzione. Vedi come un suggerimento in cui potresti cercare alcuni errori. In bocca al lupo! ^^ – Marco
I fusi orari (o il tempo sbagliato del server) possono causare problemi in alcuni casi. – Smar
@Smar Può ma ho fatto esplicitamente dire "L'ora del server è corretta e in linea con le macchine dell'utente". – pwaring