2012-06-17 21 views
6

Me pregunto cómo PHP detecta que se ha agotado el tiempo de una sesión específica.¿Cómo detecta PHP que se ha agotado el tiempo de espera de una sesión?

En detalle: Estoy usando el controlador de sesión predeterminado (basado en archivos), con una duración de sesión predeterminada, y así sucesivamente. Todo en php.ini está predeterminado.

Si ahora se inicia una sesión, PHP realiza una comprobación (dependiendo de no session.gc_divisor y session.gc_probability) si hay alguna sesión expirada. Pero, ¿desde dónde obtiene PHP la última sesión de tiempo de acceso de las sesiones para comprobar?

El archivo de sesión en sí contiene solo la carga de trabajo, p. x|i:1; para un $_SESSION['x'] = 1;, por lo que no hay información sobre el tiempo de acceso a la última sesión.

Creo que no hay información en la memoria relacionada con los tiempos de inicio de la sesión, ya que las sesiones siguen funcionando después de un reinicio completo del servidor.

Entonces, ¿de dónde obtiene PHP la información? ¿Está comparando el mtime/ctime del archivo de sesión?

Respuesta

8

El controlador de sesión predeterminado de PHP almacena los datos $ _SESSION en un archivo usando serialize(), en el directorio especificado por session.save_path. En general, el nombre del archivo es similar al $filename = 'sess_' . session_id().

Como es solo un archivo, PHP puede usar el mtime del archivo (hora de la última modificación) para determinar qué archivos de sesión están obsoletos. Básicamente tomará todos los archivos de sesión cuyo mtime excede el valor session.gc_maxlifetime y unlink(). Como ha dicho, la probabilidad de que se produzca la limpieza se rige por las variables ini session.gc_*.

Ahora, si crea sus propios manejadores de sesión con session_set_save_handler(), esto está fuera de la ventana, y ahora tiene control sobre cómo se almacenan y limpian las sesiones, pero esto explica el comportamiento predeterminado.

+0

Hola, gracias por su respuesta. Usted escribió "PHP puede usar el mtime del archivo". Estoy bastante seguro de que esta es la forma en que PHP funciona con el manejador de sesión basado en archivos predeterminado, pero ¿hay alguna declaración oficial al respecto? – hacksteak25

+1

No, pero siempre puedes verificar la fuente php si no estás seguro. Debido a que el 'tiempo de último uso' no está codificado en los datos de la sesión en sí, el mtime del archivo de sesión es el único otro lugar donde dicha información está disponible. PHP no mantiene una base de datos de mtimes en otros lugares; si lo hiciera, habría opciones de configuración para especificar dónde y cómo se guardarían esos datos. –

+0

esperaba que hubiera una manera más fácil que buscar en las fuentes;) Pero tienes razón. No hay opciones para los mtimes, así que parece que no hay nada más que el mtime del archivo. Gracias. – hacksteak25

Cuestiones relacionadas