tiempo sesion por mostrar inactividad expirar definir php session session-timeout

mostrar - expirar sesion por inactividad php



¿Cómo cambiar el tiempo de espera de la sesión en PHP? (5)

Me gustaría extender el tiempo de espera de la sesión en php

Sé que es posible hacerlo modificando el archivo php.ini. Pero no tengo acceso a eso.

Entonces, ¿es posible hacerlo solo con el código php?


El tiempo de espera de la sesión es una noción que debe implementarse en el código si desea garantías estrictas; esa es la única forma en que puede estar absolutamente seguro de que ninguna sesión podrá sobrevivir después de X minutos de inactividad.

Si relajar este requisito un poco es aceptable y está bien si coloca un límite inferior en lugar de un límite estricto a la duración, puede hacerlo fácilmente y sin escribir una lógica personalizada.

Comodidad en ambientes relajados: cómo y por qué

Si sus sesiones se implementan con cookies (que probablemente sean), y si los clientes no son maliciosos, puede establecer un límite superior en la duración de la sesión modificando ciertos parámetros. Si está utilizando el manejo de sesión predeterminado de PHP con las cookies, establecer session.gc_maxlifetime junto con session_set_cookie_params debería funcionar de la siguiente manera:

// server should keep session data for AT LEAST 1 hour ini_set(''session.gc_maxlifetime'', 3600); // each client should remember their session id for EXACTLY 1 hour session_set_cookie_params(3600); session_start(); // ready to go!

Esto funciona configurando el servidor para mantener los datos de sesión durante al menos una hora de inactividad e instruyendo a sus clientes que deben "olvidar" su id de sesión después del mismo lapso de tiempo. Ambos pasos son necesarios para lograr el resultado esperado.

  • Si no le dice a los clientes que olviden su id de sesión después de una hora (o si los clientes son maliciosos y eligen ignorar sus instrucciones) seguirán usando la misma ID de sesión y su duración efectiva no será determinante. Esto se debe a que las sesiones cuyo tiempo de vida ha caducado en el servidor no se recogen de forma inmediata sino solo cuando se inicia el GC de la sesión .

    GC es un proceso potencialmente costoso, por lo que la probabilidad es bastante pequeña o incluso nula (un sitio web que obtenga un gran número de visitas probablemente prescindirá del GC probabilístico por completo y lo programará en segundo plano cada X minutos). En ambos casos (suponiendo que los clientes no cooperen), el límite inferior para la duración efectiva de la sesión será session.gc_maxlifetime , pero el límite superior será impredecible.

  • Si no establece session.gc_maxlifetime en el mismo lapso de tiempo, entonces el servidor puede descartar los datos de la sesión inactiva antes que eso; en este caso, un cliente que todavía recuerda su ID de sesión lo presentará pero el servidor no encontrará datos asociados con esa sesión, comportándose efectivamente como si la sesión acabara de comenzar.

Certeza en ambientes críticos

Puede hacer las cosas completamente controlables mediante el uso de lógica personalizada para también colocar un límite superior en la inactividad de la sesión; junto con el límite inferior desde arriba esto da como resultado un ajuste estricto.

Haga esto guardando el límite superior junto con el resto de los datos de la sesión:

session_start(); // ready to go! $now = time(); if (isset($_SESSION[''discard_after'']) && $now > $_SESSION[''discard_after'']) { // this session has worn out its welcome; kill it and start a brand new one session_unset(); session_destroy(); session_start(); } // either new or old, it should live at most for another hour $_SESSION[''discard_after''] = $now + 3600;

Persistencia de identificación de sesión

Hasta ahora no nos han preocupado en absoluto los valores exactos de cada identificación de sesión, solo con el requisito de que los datos deberían existir todo el tiempo que los necesitemos. Tenga en cuenta que en el (poco probable) caso de que los identificadores de sesión le importen, debe tener cuidado de regenerarlos con session_regenerate_id cuando sea necesario.


No. Si no tiene acceso a php.ini, no puede garantizar que los cambios tengan algún efecto.

Sin embargo, dudo que necesites extender el tiempo de tus sesiones.
Tiene un tiempo de espera muy razonable en este momento y no hay motivos para extenderlo.


Pon $_SESSION[''login_time''] = time(); en la página de autenticación anterior. Y el recorte a continuación en cada otra página donde desee verificar el tiempo de espera de la sesión.

if(time() - $_SESSION[''login_time''] >= 1800){ header("Location: logout.php"); //redirect if the page is inactive for 30 minutes } else { $_SESSION[''login_time''] = time(); // update value of session }


Puede anular los valores en php.ini desde su código PHP usando ini_set() .


Si utiliza el manejo de sesiones predeterminado de PHP, la única forma de cambiar de manera confiable la duración de la sesión en todas las plataformas es cambiar php.ini . Eso es porque en algunas plataformas, la recolección de basura se implementa a través de un script que se ejecuta cada cierto tiempo (un script cron ) que se lee directamente de php.ini , y por lo tanto, cualquier intento de cambiarlo en tiempo de ejecución, por ejemplo, a través de ini_set() , no es confiable y lo más probable es que no funcione.

Por ejemplo, en los sistemas Debian Linux, la recolección de basura se realiza a través de /etc/cron.d/php5 que se ejecuta en XX: 09 y XX: 39 (es decir, cada media hora), y si encuentra una sesión anterior a la sesión .gc_maxlifetime especificado en php.ini , luego esa sesión se elimina sin piedad. Eso también explica por qué en esta pregunta: las sesiones de PHP se agotan demasiado rápido , el OP tuvo problemas en un host pero los problemas cesaron cuando se cambió a un host diferente.

Por lo tanto, dado que no tiene acceso a php.ini , si desea hacerlo de forma portátil, no es una opción utilizar el manejo de sesión predeterminado. Aparentemente, extender la vida útil de la cookie fue suficiente para su host, pero si desea una solución que funcione de manera confiable incluso si cambia de host, debe usar una alternativa diferente.

Los métodos alternativos disponibles incluyen:

  1. Configure un manejador de sesión (guardar) diferente en PHP para guardar sus sesiones en un directorio diferente o en una base de datos, como se especifica en PHP: Manejadores de sesión personalizados (manual de PHP) , para que el trabajo cron no lo alcance, y solo PHP recolección de basura interna se lleva a cabo. Esta opción probablemente pueda hacer uso de ini_set() para establecer session.gc_maxlifetime, pero prefiero ignorar el parámetro maxlifetime en mi callback gc() y determinar la duración máxima por mi cuenta.

  2. Olvídese completamente del manejo de la sesión interna de PHP e implemente su propia gestión de sesión. Este método tiene dos desventajas principales: necesitará sus propias variables de sesión globales, por lo que pierde la ventaja de $_SESSION superglobal, y necesita más código, por lo que hay más oportunidades para errores y fallas de seguridad. Lo que es más importante, el identificador de sesión debe generarse a partir de números aleatorios o pseudoaleatorios criptográficamente seguros para evitar la predictibilidad de la ID de sesión (lo que lleva a un posible secuestro de sesión), y eso no es tan fácil de hacer con PHP de manera portátil. La principal ventaja es que funcionará de manera consistente en todas las plataformas y usted tendrá control total sobre el código. Ese es el enfoque adoptado, por ejemplo, por el software del foro phpBB (al menos la versión 1, no estoy seguro acerca de las versiones más recientes).

Hay un ejemplo de (1) en la documentación para session_set_save_handler() . El ejemplo es largo, pero lo reproduciré aquí, con las modificaciones pertinentes necesarias para extender la duración de la sesión. Tenga en cuenta la inclusión de session_set_cookie_params() para aumentar también la duración de la cookie.

<?php class FileSessionHandler { private $savePath; private $lifetime; function open($savePath, $sessionName) { $this->savePath = ''my_savepath''; // Ignore savepath and use our own to keep it safe from automatic GC $this->lifetime = 3600; // 1 hour minimum session duration if (!is_dir($this->savePath)) { mkdir($this->savePath, 0777); } return true; } function close() { return true; } function read($id) { return (string)@file_get_contents("$this->savePath/sess_$id"); } function write($id, $data) { return file_put_contents("$this->savePath/sess_$id", $data) === false ? false : true; } function destroy($id) { $file = "$this->savePath/sess_$id"; if (file_exists($file)) { unlink($file); } return true; } function gc($maxlifetime) { foreach (glob("$this->savePath/sess_*") as $file) { if (filemtime($file) + $this->lifetime < time() && file_exists($file)) { // Use our own lifetime unlink($file); } } return true; } } $handler = new FileSessionHandler(); session_set_save_handler( array($handler, ''open''), array($handler, ''close''), array($handler, ''read''), array($handler, ''write''), array($handler, ''destroy''), array($handler, ''gc'') ); // the following prevents unexpected effects when using objects as save handlers register_shutdown_function(''session_write_close''); session_set_cookie_params(3600); // Set session cookie duration to 1 hour session_start(); // proceed to set and retrieve values by key from $_SESSION

El enfoque (2) es más complicado; básicamente, tienes que volver a implementar todas las funciones de sesión por tu cuenta. No entraré en detalles aquí.