Come riavviare Apache senza ripristinare le sessioni degli utenti?


8

L'utente ha effettuato l'accesso a un sito Web PHP> Riavvio di Apache> L'utente deve eseguire nuovamente l'accesso.

Come prevenirlo? (Non voglio che l'utente debba accedere nuovamente)


Per verificare: hai la possibilità di modificare il PHP, giusto?
Peter Taylor,

Se è la tua applicazione, suggerirei ciò che ha suggerito @Jacob Hume di seguito e modificare l'applicazione per memorizzare le sessioni in una tabella del database. Questo, secondo me, ti dà più controllo sul tuo sito in quanto puoi costringere gli utenti a disconnettersi se necessario in modo selettivo.
Anagio

Posso modificare PHP. Sto usando un CMS (Drupal). Sto anche usando APC e cercavo una soluzione in questo modo.
Dowik,

Risposte:


6

La memorizzazione di un token di sessione in una posizione alternativa come backup eviterebbe questo problema. Potresti comunque conservare le tue informazioni principali $_SESSION, ma mantenere un token di backup in:

  • Biscotti
  • Record del database
  • Archiviazione locale HTML5

Potresti trovare aiuto in questa domanda StackOverflow: best practice per i timeout della sessione e login persistente in php .


Grazie per la risposta e grazie per il link. Stavo cercando una soluzione sul file di configurazione lato server (tipo di "mantenere sessioni al riavvio"). Ma sembra che la soluzione sia nel lato app.
Dowik,

Oh mio ... In effetti stavo semplicemente cercando "apache2ctl -k graceful"!
Dowik,

3

I dati della sessione non devono essere persi solo perché Apache viene arrestato o riavviato a meno che i dati della sessione non vengano archiviati in memoria e non sottoposti a backup su disco (né dal filesystem né dal database). Altrimenti, è possibile riavviare l'intero server e la sessione continuerebbe comunque. I dati della sessione sono progettati per essere archiviati a lungo termine. L'unica volta che la sessione viene persa è se:

  1. Il SID è perso. I dati della sessione esistono ancora sul lato server, ma il client non è in grado di ripristinare il SID, quindi non può riavviare la stessa sessione. Ciò può accadere se il cookie SID scade (se è un cookie) o i collegamenti di sessione vengono persi (se il SID è un parametro URL) o il SID non è impostato sul lato server o viene modificato senza avvisare il client.

  2. I dati della sessione vengono eliminati sul lato server. Questo di solito accade quando PHP Session Garbage Collector viene eseguito e vede il file di sessione più vecchio di session.gc_maxlifetime (che è di default 24 minuti). Altrimenti, può succedere se l'applicazione elimina esplicitamente la sessione . Su alcuni server, l'amministratore potrebbe anche aver configurato un cronjob per ripulire regolarmente i vecchi dati della sessione.


Grazie per i dettagli Investigherò in questo modo. Ma in questo momento, userò semplicemente il grazioso riavvio che sembra adattarsi alle mie esigenze.
Dowik,

@dowik: in che modo un riavvio gradevole si adatta alle tue necessità? Il tuo problema è stato perso sessioni o download interrotti? Se è quest'ultimo, il grazioso riavvio / spegnimento lo risolverà davvero. Ma poi dovresti modificare la tua domanda per riflettere ciò. Perché i riavvii graziosi non hanno nulla a che fare con le sessioni PHP e non aiuterà gli altri utenti a cercare di impedire la perdita di sessioni.
Lèse majesté,

Ho provato ad aggiornare il titolo della mia domanda sostituendo "sessioni PHP" con "sessioni utenti" come descrivo nel corpo della mia domanda. Meglio per te? Per essere più precisi: utilizzo APC. Quando cambio codice nei file PHP, devo svuotare la cache APC (riavviare Apache è il modo più semplice per farlo, lo so). Con l'argomento "riavvio", gli utenti del mio sito Web devono effettuare nuovamente l'accesso. Mentre con "aggraziato", non lo fanno. Ecco perché "sembra adattarsi alle mie necessità".
Dowik,

@dowik: non penso che abbia nulla a che fare con un riavvio aggraziato. Molto probabilmente hai appena avuto un riavvio in coincidenza con il garbage collector delle sessioni PHP. Accedi di nuovo e prova a riavviare regolarmente subito dopo. A meno che non si stiano memorizzando sessioni in memoria (MM), la sessione verrà salvata.
Lèse majesté,

1

Reso possibile utilizzando l'argomento giusto con Apache:

apache2ctl -k graceful

Apache si riavvierà senza perdere le sessioni correnti.


2
Il riavvio corretto rimanda solo l'arresto fino al termine delle connessioni correnti. Non cambia il comportamento di riavvio.
Lèse majesté,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.