usuarios usando sesiones pasar paginas manejo entre ejemplos ejemplo control autenticación php security cookies session-timeout

usando - pasar variables de session entre paginas php



Tiempos de espera de sesión en PHP: mejores prácticas (4)

Cada vez que session_start se llama la fecha y hora de los archivos de sesión (si existe) se actualiza, que se usa para calcular si se ha excedido session.gc_maxlifetime.

Lo que es más importante, no puede depender de que una sesión expire después de la sesión. Se ha excedido el tiempo de vida de CGc.

PHP ejecuta la recolección de elementos no utilizados en las sesiones expiradas después de cargar la sesión actual y mediante el uso de session.gc_probability y session.gc_divisor calcula la probabilidad de que se ejecute la recolección de elementos no utilizados. Por defecto es un 1% de probabilidad.

Si tiene un número bajo de visitantes, existe la probabilidad de que un usuario inactivo pueda acceder a una sesión que debería haber expirado y eliminado. Si esto es importante, deberá almacenar una marca de tiempo en la sesión y calcular cómo ha estado inactivo un usuario.

Este ejemplo reemplaza session_start y exige un tiempo de espera:

function my_session_start($timeout = 1440) { ini_set(''session.gc_maxlifetime'', $timeout); session_start(); if (isset($_SESSION[''timeout_idle'']) && $_SESSION[''timeout_idle''] < time()) { session_destroy(); session_start(); session_regenerate_id(); $_SESSION = array(); } $_SESSION[''timeout_idle''] = time() + $timeout; }

¿Cuál es la diferencia real entre session.gc_maxlifetime y session_cache_expire() ?

Supongamos que quiero que la sesión de los usuarios no sea válida después de 15 minutos de inactividad (y no 15 después de que se abrió por primera vez). ¿Cuál de estos me ayudará allí?

También sé que puedo hacer session_set_cookie_params() que puede configurar la cookie del usuario para que expire en un cierto período de tiempo. Sin embargo, la cookie que expira y la sesión actual que expira en el servidor no son lo mismo; ¿Esto también elimina la sesión cuando la cookie ha expirado?

Otra solución que tengo es simple $_SESSION[''last_time''] = time() en cada solicitud, y comparando la sesión con la hora actual, eliminando la sesión en función de eso. Esperaba que hubiera un mecanismo más "incorporado" para manejar esto.

Gracias.


Para verificar los valores actuales, este código será útil:

$gc_maxlifetime = ini_get(''session.gc_maxlifetime''); $gc_probability = ini_get(''session.gc_probability''); $gc_divisor = ini_get(''session.gc_divisor'');


Pasé un tiempo buscando una buena respuesta a cómo la configuración del servidor php.ini hace que las sesiones caduquen. Encontré mucha información, pero me tomó un tiempo descubrir por qué la configuración funciona de la manera en que lo hacen. Si eres como yo, esto podría ser útil para ti:

Las sesiones se almacenan como cookies (archivos en la PC del cliente) o del lado del servidor como archivos en el servidor. Ambos métodos tienen ventajas y desventajas.

Para las sesiones almacenadas en el servidor, se usan tres variables.

session.gc_probability session.gc_divisor session.gc_maxlifetime

(session.gc_probability / session.gc_divisor) produce la probabilidad de que se ejecute la rutina de recolección de basura. Cuando se ejecuta el recolector de elementos no utilizados, comprueba los archivos de sesión a los que no se ha accedido durante al menos session.gc_maxlifetime y los elimina.

Todo esto se explica bastante bien en las publicaciones del foro (¡esta especialmente!) - Pero las siguientes preguntas surgen:

1.) ¿Cómo se aplica esa probabilidad? ¿Cuándo tira el servidor los dados?

R: El servidor tira los dados cada vez que se llama a session_start () durante cualquier sesión activa en el servidor. Esto significa que debería ver que el recolector de basura se ejecuta aproximadamente una vez cada 100 veces que se invoca session_start () si tiene el valor predeterminado de session.gc_probability = 1 y session.gc_divisor = 100

2.) ¿Qué sucede en los servidores de bajo volumen?

R: Cuando se llama a session_start (), FIRST actualiza la sesión y pone a su disposición los valores de la sesión. Esto actualiza la hora en su archivo de sesión en el servidor. ENTONCES tira los dados y si gana (1 de cada 100 posibilidades) llama al recolector de basura. El recolector de elementos no utilizados luego comprueba todos los archivos de id de sesión y ve si hay alguno que sea apto para eliminación.

Entonces, esto significa que si usted es la única persona en el servidor, su sesión nunca estará inactiva y parecerá que cambiar la configuración no tiene efecto. Digamos que cambia session.gc_maxlifetime a 10 y session.gc_probability a 100. Esto significa que hay un 100% de posibilidades de que el recolector de elementos no utilizados se ejecute y borrará los archivos de sesión a los que no se haya accedido en los últimos 10 segundos.

Si eres el único en el servidor, tu sesión no será eliminada. Necesita al menos otra sesión activa para que la suya quede inactiva.

Así que, básicamente, en un servidor de bajo volumen o en un tiempo de volumen bajo, podría ser MUCHO más largo que session.gc_maxlifetime antes de que realmente se ejecute el recolector de elementos no utilizados y las sesiones realmente se eliminen. Y sin saber cómo funciona esto, puede parecer completamente aleatorio para usted.

3.) ¿Por qué usan la probabilidad?

Una actuación. En un servidor de mayor volumen, no desea que el recolector de elementos no utilizados se ejecute en cada solicitud de session_start (). Se ralentizará el servidor innecesariamente. De modo que, dependiendo del volumen de su servidor, es posible que desee aumentar o disminuir la probabilidad de que se ejecute el recolector de elementos no utilizados.

Espero que esto una las cosas para ti. Si eres como yo y probaste session.gc_maxlifetime y parece que no funcionó (porque lo probaste en un servidor de desarrollo para no molestar a nadie), entonces esta publicación espero que te haya ahorrado algunos problemas.

¡Buena suerte!


session.gc_maxlifetime se basa en la última vez que se modificó un archivo de sesión. Por lo tanto, cada vez que se modifica un archivo de sesión o se llama a session_start () en una página separada, la cuenta atrás para gc_maxlifetime comienza de nuevo y el usuario permanece "conectado". Este es el valor que está buscando. Puedes modificar esto a través de ini_set () en tus archivos php, o editar php.ini si tienes acceso a él

session_cache_expire () solo controla el encabezado HTTP "Caduca". Este encabezado controla cuánto tiempo permanecen los contenidos de la página descargada en el caché del navegador del usuario.