Red de conocimiento informático - Material del sitio web - Cómo establecer estrictamente el tiempo de vencimiento de la sesión en php

Cómo establecer estrictamente el tiempo de vencimiento de la sesión en php

¡Cómo limitar estrictamente que la sesión caduque después de 30 minutos!

1. Establezca la vida útil de la cookie del cliente en 30 minutos;

2. Establezca la vida útil máxima de la sesión en 30 minutos. cada uno Agregue una marca de tiempo a cada valor de sesión y luego juzgue cuando se llama al programa;

En cuanto a por qué, primero comprendamos los principios básicos de las sesiones en PHP:

La sesión El período de validez en PHP es por defecto de 1440 segundos (24 minutos), es decir, si el cliente no se actualiza durante más de 24 minutos, la sesión actual dejará de ser válida. Por supuesto, si el usuario cierra el navegador, la sesión finalizará y, naturalmente, ¡la sesión ya no existirá!

Como todos sabemos, la sesión se almacena en el lado del servidor. El archivo del usuario se obtiene en función del ID de sesión proporcionado por el cliente y luego se lee el archivo para obtener el valor de la variable. SessionID puede utilizar la cookie del cliente o el protocolo Http1.1

Query_String (la parte después del "?" de la URL a la que se accede) se envía al servidor y luego el servidor lee el directorio de la sesión. ...

Para controlar el ciclo de vida de la sesión, en primer lugar, debemos comprender la configuración relevante de php.ini sobre la sesión (abra el archivo php.ini, en "[Sesión] "sección):

1. session.use_cookies: el valor predeterminado es "1", representa SessionID que usa Cookie para pasar; de lo contrario, usa Query_String para pasar;

2. sesión. nombre: este es el nombre de la variable almacenada en SessionID, que puede ser Cookie o Query_String. El valor predeterminado es "PHPSESSID";

3. cookie El valor predeterminado es 0, lo que significa que el ID de sesión se invalidará tan pronto como el navegador lo cierre... ¡Es por esto que la sesión no se puede utilizar de forma permanente!

4. session.gc_maxlifetime: este es el momento en que los datos de la sesión se almacenan en el lado del servidor. Si se excede este tiempo, los datos de la sesión se eliminarán automáticamente.

Hay muchas configuraciones, pero estas son las relacionadas con este artículo. Comencemos con cómo configurar el período de supervivencia de la sesión.

Como se mencionó anteriormente, el servidor lee los datos de la sesión a través de SessionID, pero generalmente el SessionID enviado por el navegador desaparece después de cerrarlo, por lo que solo necesitamos configurar manualmente el SessionID y guardarlo. ...

Si tiene los permisos operativos del servidor, configurar esto es muy, muy simple. Sólo necesita realizar los siguientes pasos:

1. .use_cookies" Si es 1, use Cookie para almacenar SessionID, pero el valor predeterminado es 1, generalmente no es necesario modificarlo;

2. Cambie "session.cookie_lifetime" al tiempo que necesita configurar (para por ejemplo, una hora, puede configurarlo en 3600, en segundos);

3. Establezca "session.gc_maxlifetime" al mismo tiempo que "session.cookie_lifetime";

En la documentación de PHP se indica claramente que la configuración El parámetro que determina el período de validez de la sesión es session.gc_maxlifetime. Este parámetro se puede modificar en el archivo php.ini o mediante la función ini_set(). El problema es que después de muchas pruebas, modificar este parámetro básicamente no tiene ningún efecto y el período de validez de la sesión aún mantiene el valor predeterminado de 24 minutos.

Debido al mecanismo de trabajo de PHP, no tiene un hilo demonio para escanear periódicamente la información de la sesión y determinar si no es válida. Cuando se produce una solicitud válida, PHP decidirá si iniciar un GC en función del valor de la variable global

session.gc_probability/session.gc_divisor (que también se puede modificar a través de php.ini o ini_set( ) función) (Recolector de basura).

De forma predeterminada, session.gc_probability = 1, session.gc_divisor

= 100, lo que significa que hay un 1% de probabilidad de que se inicie GC. El trabajo del GC es escanear toda la información de la sesión, restar la hora de la última modificación de la sesión (fecha de modificación) de la hora actual y compararla con el parámetro session.gc_maxlifetime If If la vida útil. ha excedido gc_maxlifetime, la sesión se eliminará.

Hasta el momento todo funciona bien. Entonces, ¿por qué gc_maxlifetime deja de ser válido?

De forma predeterminada, la información de la sesión se guardará en el directorio de archivos temporales del sistema en forma de archivos de texto. En Linux, esta ruta suele ser \tmp y en Windows suele ser C:\Windows\Temp. Cuando hay varias aplicaciones PHP en el servidor, guardarán sus archivos de sesión en el mismo directorio. De manera similar, estas aplicaciones PHP también iniciarán GC con cierta probabilidad y escanearán todos los archivos de sesión.

El problema es que cuando el GC está funcionando, no distingue entre sesiones en diferentes sitios. Por ejemplo, gc_maxlifetime del sitio A está configurado en 2 horas y gc_maxlifetime del sitio B está configurado en 24 minutos predeterminados. Cuando se inicia el GC del sitio B, escaneará el directorio público de archivos temporales y eliminará todos los archivos de sesión de más de 24 minutos, independientemente de si provienen del sitio A o B. De esta manera, la configuración gc_maxlifetime del sitio A es inútil.

Una vez encontrado el problema, es fácil solucionarlo. Modifique el parámetro session.save_path o utilice la función session_save_path() para señalar el directorio donde se guarda la sesión en un directorio dedicado. El parámetro gc_maxlifetime funciona normalmente.

Otro problema es que gc_maxlifetime solo puede garantizar el tiempo más corto para que la sesión sobreviva y no se puede guardar. Después de este tiempo, la información de la sesión se eliminará inmediatamente. Debido a que GC se inicia según la probabilidad y es posible que no se inicie durante un largo período de tiempo, una gran cantidad de sesiones seguirán siendo válidas después de exceder gc_maxlifetime.

Una forma de resolver este problema es aumentar la probabilidad de session.gc_probability/session.gc_divisor. Si se menciona al 100%, este problema se resolverá por completo, pero obviamente tendrá un impacto grave en el rendimiento. . Otro método es juzgar usted mismo la vida útil de la sesión actual

en el código. Si excede gc_maxlifetime, borre la sesión actual.