2011-12-26 11 views
5

Estoy construyendo un sitio de reserva de entradas en línea. En esto estoy haciendo lo siguiente: el usuario busca en el bus con sus números de asiento. La base de datos se actualiza con los números de asiento con temp_seat_book = 'Y'. Si reserva el boleto pagando dinero, su estado se actualizará al final_ticket_book = 'Y'. Ahora quiero eliminar el campo cuyo temp_seat_book = 'Y' pero final_ticket_book = 'N'. Para esto necesito eliminar los session_ids que tienen más de 10 minutos de antigüedad y final_ticket_book = 'N'. Entonces, ¿cómo puedo implementar el trabajo de fondo?Desactivar sesión después de algún tiempo

+0

simplemente una marca de tiempo y comprobar que funciona? – footy

+1

no sería más sencillo un campo de base de datos de 'seat_status' con uno de los 3 estados. –

+0

puede encontró su respuesta aquí http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes –

Respuesta

9

En vez de hacer una búsqueda de archivos (que involucra a más de E/S), etc, ¿Qué es una cookie de sesión: Session Cookie
Una mejor manera es almacenar un sello de tiempo de la 'actividad más reciente' en la variable $ _SESSION.
Y actualizando los datos de sesión en cada solicitud (incluidas las llamadas ajax periódicas automatizadas, si las hay).

Digamos que usted quiere desarmar la sesión después de 10 minutos,

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. 

Para evitar ataques como Session fixation: (Fijación de Sesión es un ataque que permite a un atacante secuestrar una sesión de usuario válido) mantener la regeneración la identificación de la sesión dice periódicamente durante 5 minutos (sugiero que se mantenga un poco más el tiempo de regeneración y el tiempo de expiración de la sesión). Una lista más elaborada de ataques: attack list.

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

Además, asegúrese de session.gc-maxlifetime está ajustado al máximo expira el tiempo que desee utilizar. Usted puede hacer esto

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


O Conjunto directamente en su php.ini.

y también

session.cookie_lifetime:

session.cookie_lifetime especifica la duración de la cookie en cuestión de segundos que se envía al navegador.

Pero, la destrucción de la sesión debe tenerse en cuenta desde el lado del servidor y no desde el lado del cliente. Al establecer session.cookie_lifetime en 0, la cookie de la sesión se comportaría de la misma manera que una cookie de sesión, es decir, que una cookie de sesión solo es válida hasta que se cierre el navegador.

Aunque este método es un poco tedioso, es más elegante.

¡Ah, encontré el enlace que había leído hace mucho tiempo! : How do I expire a PHP session after 30 minutes?

3

sesiones de PHP estándar se almacenan en archivos. Se podría implementar un simple script de shell para encontrar cualquier archivo de sesión que no ha sido tocado en 10 minutos:

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

grep puede ser usado para encontrar los archivos de sesión que tienen un final_ticket_book = valor 'N' almacenada en ellas :

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

(the -l flags has grep escupen los nombres de los archivos que coinciden).

combinación de los dos le da:

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