2011-12-26 10 views
5

Sto costruendo un sito di prenotazione biglietti online. In questo sto facendo le seguenti cose: L'utente cerca il bus con i loro numeri di posto. Il database viene aggiornato con i numeri di posto con temp_seat_book = 'Y'. Se prenota il biglietto pagando i soldi, il suo stato sarà aggiornato a final_ticket_book = 'Y'. Ora voglio cancellare il campo di cui temp_seat_book = 'Y' ma final_ticket_book = 'N'. Per questo ho bisogno di cancellare il session_ids che è più di 10 minuti vecchi e final_ticket_book = 'N'. Quindi, come posso implementare il lavoro in background?Annulla sessione dopo un po 'di tempo

+0

basta avere un timestamp e controllarlo? – footy

+1

non sarebbe più facile un singolo campo db di "seat_status" con uno dei 3 stati. –

+0

may Hai trovato la tua risposta qui http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes –

risposta

9

Invece di fare una ricerca per i file (che coinvolge più di I/O), ecc, Che cosa è un cookie di sessione: Session Cookie
Un modo migliore è quello di memorizzare un timestamp della 'attività più recente' nella variabile $ _SESSION.
E aggiornamento dei dati di sessione su ogni richiesta (incluse le chiamate periodiche automatiche ajax, se presenti).

Diciamo che si desidera disinserire la sessione dopo 10 minuti,

if (isset($_SESSION['most_recent_activity']) && 
    (time() - $_SESSION['most_recent_activity'] > 600)) { 

//600 seconds = 10 minutes 
session_destroy(); 
session_unset(); 

} 
$_SESSION['most_recent_activity'] = time(); // the start of the session. 

Per evitare attacchi come Session fixation: (Session Fixation è un attacco che permette a un utente malintenzionato di dirottare una sessione utente valido) mantenere rigenerante l'id della sessione dice periodicamente per 5 minuti (suggerirei di mantenere un po 'più il tempo di rigenerazione e la sessione scadono un po'). Un elenco di attacchi più elaborato: attack list.

if (!isset($_SESSION['CREATED'])) { 
    $_SESSION['CREATED'] = time(); 
    } 
else if (time() - $_SESSION['CREATED'] > 600) { 
    session_regenerate_id(true);  
    $_SESSION['CREATED'] = time(); 
    } 

Inoltre, assicurarsi session.gc-maxlifetime è impostato al massimo scade il tempo che si desidera utilizzare. È possibile farlo

ini_set('session.gc-maxlifetime', 600) 


O Situato direttamente nel tuo php.ini.

e anche

session.cookie_lifetime:

session.cookie_lifetime specifica la durata del cookie in secondi che viene inviato al browser.

Tuttavia, la distruzione della sessione deve essere eseguita con attenzione sul lato server e non sul lato client. L'impostazione di session.cookie_lifetime su 0 renderebbe il comportamento del cookie della sessione come un cookie di sessione, nel senso che un cookie di sessione è valido solo fino alla chiusura del browser.

Anche se questo metodo è un po 'tedioso, è più elegante.

Ah, ho trovato il collegamento che avevo letto molto tempo fa! : How do I expire a PHP session after 30 minutes?

3

Le sessioni PHP standard sono archiviate in file. Si potrebbe implementare un semplice script di shell di trovare qualsiasi file di sessione, che non è stato toccato in 10 minuti:

find /path/to/session/dir/* -mmin -10 

grep può essere utilizzato per trovare i file di sessione che hanno un valore di final_ticket_book = 'N' memorizzato in loro :

grep -l 's:17:"final_ticket_book";s:1:"N";' 

(i flag -l hanno grep che sputa i nomi dei file che corrispondono).

Combinando i due ti dà:

find /path/to/session/dir -mmin -10|xargs grep -l 's:17:"final_ticket_book";s:1:"N";'|xargs rm -f 
Problemi correlati