2009-05-27 17 views
6

Sono in perdita qui. Ho un gruppo specifico di utenti al piano superiore le cui sessioni sembrano scadere in modo completamente casuale. Non è solo quando lasciano il sito seduto per un po ', ma può scadere mentre navigano. Per me e la maggior parte dei nostri utenti tutto funziona perfettamente. Non è un problema di browser, abbiamo persone in FF e tutte le versioni di IE che funzionano entrambe correttamente, e le persone in FF e IE che non funzionano.Sessioni PHP che scadono inaspettatamente

Il mio gc_maxlifetime è a 43200 e la garbage collection è un pazzo basso 1/1000 (non che ciò dovrebbe importare). È possibile che ci sia qualcos'altro in esecuzione sul server che cancella in modo casuale alcune delle nostre sessioni? Cosa dovrei controllare? Ciò non spiegherebbe ancora perché solo questo specifico gruppo sembra essere interessato.

Ho un paio di impostazioni di sessione che sono diverse da quella di default:

session.gc_maxlifetime = 43200 
session.gc_divisor = 1000 
session.save_path = /var/lib/php/session 
session.use_only_cookies = Off 
session.bug_compat_42 = Off 

I primi tre non sono preoccupato, ma potrebbe gli ultimi due causare questo comportamento? In realtà non invio mai cookie tramite l'URL, quindi non ho buone ragioni per escludere use_only_cookies. Non ho alcuna garanzia che i disadattati che hanno fatto questa app prima di arrivare qui non abbiano sfruttato la cosa bug_compat_42 per impostare le variabili di sessione, ma, ancora una volta, mi aspetto che un problema sia meno casuale.

Edit:

Su ulteriori indagini, ho trovato che la sessione non viene distrutto a tutti, ma l'utente finale è ottenere un nuovo ID di sessione. La vecchia sessione esiste ancora intatta sul server, ma una nuova viene avviata casualmente mentre sta navigando.

+0

Una delle due cose sta accadendo: il file di sessione sul server viene eliminato o il cookie di sessione è in scadenza. Cercherei di isolare il caso che uno o l'altro accada e poi di lavorare da lì. –

+0

Ho determinato che non è la sessione in corso di eliminazione. Come posso verificare se il cookie sta scadendo? –

risposta

5

Il problema qui è che il loro browser stava impostando il cookie di sessione per scadere prematuramente. Ho risolto il problema con questo trucco sporco e sporco che non avresti mai dovuto usare, mai.Io non sono orgoglioso di questo, ma se questo brilla po 'di luce su tutto ciò sento libero di farmi entrare:

if (!headers_sent()) { 
    if ($_COOKIE["PHPSESSID"] != "") { 
     setcookie("PHPSESSID", $_COOKIE["PHPSESSID"], time()+43200, "/", ".mydomain.com"); 
    } 
} 
+0

Sapete quali browser sono stati interessati da questo problema, stiamo vedendo qualcosa di simile con alcuni utenti che utilizzano solo il codice IO10. – Cliffordlife

+0

Il codice molto simile è la nota più popolare per session_set_cookie_params sul sito php. Sembra che devi fare qualcosa per far funzionare le cose correttamente. http://www.php.net/manual/en/function.session-set-cookie-params.php#100657 –

+0

Ho avuto lo stesso problema di te ma su hosting a pagamento. Non riuscivo a capire cosa potesse causare una scadenza prematura, quindi l'ho fatto in modo simile a te. Grazie. – HelpNeeder

1

Puoi fornire ulteriori informazioni sulla configurazione?

Il mio primo pensiero sarebbe che ci sia qualcosa che cancella in modo casuale la tua directory di file temporanei. Se stai usando una configurazione LAMP standard, PHP memorizzerà i file dei dati di sessione in/tmp. Se vengono eliminati da un processo di pulizia, perdi le sessioni.

Edit: Sto ripensando questo ora. Se è interessato solo un gruppo specifico di utenti, ciò lo rende molto meno probabile.

E le impostazioni dei cookie? Mi assicuro che queste persone non utilizzino qualcosa come un proxy dinamico e che i cookie siano impostati per il dominio principale del sito. È possibile che possano avere un software per la pulizia della privacy come CCleaner impostato come attività pianificata che potrebbe rimuovere i loro cookie?

Mi piacerebbe arrivare su uno dei loro computer e lanciare Firebug su una delle macchine di Firefox ed esaminare le richieste HTTP per vedere se i cookie vengono inviati correttamente.

+0

Come ho già detto, ho preso in considerazione questa opzione, ma non credo che ciò produrrebbe il comportamento che sto ottenendo. Se qualcosa stesse eliminando le sessioni, mi aspetterei che tutti si disconnettessero simultaneamente. Invece ho solo un piccolo gruppo di persone che vengono disconnesse casualmente. Quali altre informazioni sulla configurazione sarebbero utili? –

+0

È possibile verificare tutte le impostazioni della sessione. C'è una lista su http://ca2.php.net/manual/en/session.configuration.php. – zombat

1

Installerei qualche sniffer http come httpwatch (pagato ma vale ogni centesimo) o fiddler (gratuito) su quelle macchine e vedere cosa succede con i cookie di sessione (penso che sia PHPSESSID, ma non sono sicuro). Se il cookie viene eliminato o modificato durante la sessione a causa di proxy, configurazione di Apache o qualcosa del genere, questo sarebbe il modo migliore per rilevarlo.

1

So che questo è in ritardo. Ma solo per alcune persone che hanno lo stesso problema.

[Se crittografare e decrittografare i dati]

Ho eseguito con questo problema e mi ha portato un po 'per capire qual è il problema. Continua a creare un nuovo ID di sessione per lo stesso utente. Si scopre che i dati di crittografia e di decrittografia non sono gli stessi. I dati di decrittografia vengono restituiti con alcuni spazi bianchi aggiuntivi. Prova a verificare il valore dei tuoi dati quando invii e ritorni dal database o da qualsiasi archivio che stai utilizzando.

0

Nel mio progetto viene utilizzata una libreria per proteggere la sessione. A volte ho notato che la mia sessione viene distrutta improvvisamente.

https://github.com/ezimuel/PHP-Secure-Session/blob/master/SecureSession.php

prima voglio tonnellata sapere qual è lo scopo di questa biblioteca, che possiamo per queste impostazioni da php.ini pure.

CHIAVE _... un nuovo creato a cosa serve questa CHIAVE.

Quando uso print_r all'interno open(), ottengo qui di seguito risultato del campione

Hqx_SecureSession Object 
(
    [_debug:Hqx_SecureSession:private] => 
    [_key:protected] => 5ò™6žÝ°rIÐß'k Êii07ÀtCzª[email protected]ü¸"‡ÄCžA¼ÿ£g{IP 
    [_path:protected] => c:\hqp\xampp_1.7.4\tmp\ 
    [_name:protected] => PHPSESSID 
    [_ivSize:protected] => 16 
    [_keyName:protected] => KEY_PHPSESSID 
    [_cookieParams:protected] => Array 
     (
      [lifetime] => 7200 
      [path] =>/
      [domain] => dev.autoquotes.insurance.com 
      [secure] => 
      [httponly] => 1 
     ) 

    [_sessionId:protected] => 
    [_logger:Hqx_SecureSession:private] => 
) 
htq827r4rjh9ob05nhlqb8vmd5ai52djb0bd0l42vk9un26df541c:\hqp\xampp_1.7.4\tmp