utilizando una tiempo session_start sesion que hacer funciones cookie configurar como caduque php session persistence

una - PHP-ini_set(''session.gc_maxlifetime'', 5)-¿Por qué no finaliza la sesión?



sid php (4)

Incluso si el recolector de basura activó y eliminó el archivo de sesión que abrió / leyó con session_start() , NO alcanzará las entrañas de ese proceso PHP en particular y eliminará la matriz de objetos $_SESSION .

Suponiendo que está en el controlador de sesión estándar basado en archivos (que contiene una copia serialize() de $_SESSION ), esto es lo que sucede.

  1. El archivo de sesión se encuentra en su directorio temporal.
  2. session_start() , lo que hace que PHP abra / bloquee el archivo, lea su contenido, deserialice los datos y, por cierto, actualice la marca de tiempo del "último uso" del archivo de la sesión (atime en las cajas de Unix).
  3. Si las estrellas y la luna están alineadas correctamente con el ascendente Neptuno en la quinta casa, el recolector de basura de la sesión PUEDE iniciar y eliminar los archivos de la sesión anterior.
  4. El recolector de basura recorrerá el directorio de la sesión y eliminará cualquier archivo que sea más antiguo que max_liftime, PERO NO BORRARÁ NINGÚN ARCHIVO ACTUALMENTE ABIERTO / EN USO . Dado que no ha cerrado () la sesión, el archivo de la sesión todavía está en uso, por lo que no se eliminará.

Ahora, si hiciste algo como esto:

ini_set(...); // set GC probability to max, short session lifetime, etc... session_start(); // populate $_SESSION session_write_close(); // dump $_SESSION out to file, close file, release lock. sleep(7); // Sleep for 7 seconds; session_start(); // re-populate $_SESSION;

Ahora puede terminar con una $ _SESSION nueva en blanco, SI el recolector de basura decide iniciar la actividad. Sin embargo, a menos que haga esa segunda session_start() , los antiguos datos de _ _SESSION de la llamada inicial start () ESTARÁN PRESENTES . Es posible que el archivo de sesión se haya eliminado, pero el recolector de basura no tocará lo que está presente en la memoria de su script mientras se ejecuta.

El script PHP es el siguiente:

<?php // continue.php ini_set(''session.gc_maxlifetime'', 5); session_start(); echo ini_get(''session.gc_maxlifetime''); // wait for 7 seconds usleep(7000000); if (isset($_SESSION[''username''])) { $username = $_SESSION[''username'']; $password = $_SESSION[''password'']; $forename = $_SESSION[''forename'']; $surname = $_SESSION[''surname'']; echo "Welcome back $forename.<br /> Your full name is $forename $surname.<br /> Your username is ''$username'' and your password is ''$password''."; } else echo "Please <a href=authenticate2.php>click here</a> to log in."; ?>

Según el tiempo de espera (es decir, 5 segundos), la secuencia de comandos no debe imprimir nada. Sin embargo, todavía recibo el siguiente mensaje

5Welcome back Bill. Your full name is Bill Smith. Your username is ''bsmith'' and your password is ''mysecret''.

Parece que la línea ini_set (''session.gc_maxlifetime'', 5) no funciona como debería. Estoy usando windowsxp + xamm.

¿Puedes decirme cómo hacer que funcione?

Gracias


Lea el manual (énfasis mío):

session.gc_maxlifetime especifica el número de segundos después de los cuales los datos se verán como ''basura'' y se limpiarán potencialmente . La recolección de basura puede ocurrir durante el inicio de la sesión (dependiendo de session.gc_probability y session.gc_divisor ).

En la misma página:

session.gc_divisor junto con session.gc_probability define la probabilidad de que el proceso gc (recolección de basura) se inicie en cada inicialización de sesión. La probabilidad se calcula utilizando gc_probability/gc_divisor , por ejemplo, 1/100 significa que hay un 1% de probabilidad de que el proceso GC se inicie en cada solicitud. session.gc_divisor defecto es 100.

Ahora haga los cálculos y vea que no es muy probable que se llame al GC en cada solicitud.

Debe almacenar en la sesión una variable que ahorre el tiempo de la última actividad del usuario y usarla en lugar de que la sesión esté lógicamente "activa". No confíe en la recolección de basura.


No creo que sea así gc_maxlifetime se supone que gc_maxlifetime funciona. El manual dice

session.gc_maxlifetime especifica el número de segundos después de los cuales los datos se verán como ''basura'' y se limpiarán potencialmente .

(énfasis mío)

En su caso, la sesión sigue activa. Por lo tanto, no creo que esté sujeto a la recolección de basura.

Puedes intentar hacer un session_write_close() antes del sleep (). Eso podría aumentar la probabilidad de que el recolector de basura.


session.gc_maxlifetime es el número de segundos después de los cuales la sesión se considerará para la recolección de basura.

session.gc_probability y session.gc_divisor luego determinan la probabilidad de que la recolección de basura se ejecute en cualquier inicio de sesión