Foros del Web » Programando para Internet » PHP »

Duración de sesiones

Estas en el tema de Duración de sesiones en el foro de PHP en Foros del Web. Buenas a todos: Tengo un problema con la duración de sesiones, al parecer estas no caducan nunca. Si, ni después de varias horas de inactividad. ...
  #1 (permalink)  
Antiguo 14/06/2008, 05:54
 
Fecha de Ingreso: marzo-2008
Mensajes: 96
Antigüedad: 16 años, 1 mes
Puntos: 0
Duración de sesiones

Buenas a todos:
Tengo un problema con la duración de sesiones, al parecer estas no caducan nunca.
Si, ni después de varias horas de inactividad.
Quiero que caduquen al de 20 minutos, busqué en este foro algún ejemplo y lo puse, pero no me da resultado.
Ahora mismo tengo puesto esto al principio de cada página:
Código PHP:
if (!isset($_SESSION) || empty($_SESSION))
{
ini_set("session.gc_maxlifetime","1200");
    
session_start();
}
if(empty(
$_SESSION['nombresesion']))
{
header("location:form_login.php");
exit;

He probado a poner el session.gc_maxlifetime a 60 segundos y tampoco...
Hay alguna otra manera? algo que sea tipo session_timeout? (no se como funciona)

Un saludo a todos y gracias.

Última edición por Sancas; 14/06/2008 a las 06:30
  #2 (permalink)  
Antiguo 14/06/2008, 06:55
Avatar de almarin  
Fecha de Ingreso: junio-2008
Mensajes: 44
Antigüedad: 15 años, 10 meses
Puntos: 4
Respuesta: Duración de sesiones

Hola:

Cuando estableces gc_maxlifetime, símplemente dices el tiempo máximo de sesión, pero siempre que el recolector de basura de sesiones (garbage collection, de ahí lo de gc_...) se ejecute. El GC no se ejecuta SIEMPRE, sino que hay una probabilidad de que se ejecute, que por defecto es:

session.gc_probability = 1
session.gc_divisor = 100

Es decir, se ejecutaría un 1% de las veces que ejecutes tu script. Por eso, si estás programando en local y sólo eres tu quien está haciendo peticiones a tu servidor web, hay muy poca probabilidad de que el gc se ejecute.

Para mantener un control más fino, te recomiendo que hagas algo como esto:
Código PHP:

    
if (($_SESSION['session_time']+$conf['session']['time'])<time()){
        
$_SESSION=array();
        
header('location: '.__BASE."login.php?referer=".urlencode($_SERVER['PHP_SELF']));
        exit;
    }else{
        
$_SESSION['session_time']=time();
    } 
Que no es, ni más ni menos, que ir guardando en la sesión el timestamp de la última operación que se realizó, y si es mayor a un número dado (yo lo indco como $conf['session']['time']), entonces caduca.

Espero que te sea de ayuda.
  #3 (permalink)  
Antiguo 14/06/2008, 07:13
 
Fecha de Ingreso: marzo-2008
Mensajes: 96
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Duración de sesiones

Cita:
Iniciado por almarin Ver Mensaje
Hola:

Cuando estableces gc_maxlifetime, símplemente dices el tiempo máximo de sesión, pero siempre que el recolector de basura de sesiones (garbage collection, de ahí lo de gc_...) se ejecute. El GC no se ejecuta SIEMPRE, sino que hay una probabilidad de que se ejecute, que por defecto es:

session.gc_probability = 1
session.gc_divisor = 100

Es decir, se ejecutaría un 1% de las veces que ejecutes tu script. Por eso, si estás programando en local y sólo eres tu quien está haciendo peticiones a tu servidor web, hay muy poca probabilidad de que el gc se ejecute.

Para mantener un control más fino, te recomiendo que hagas algo como esto:
Código PHP:

    
if (($_SESSION['session_time']+$conf['session']['time'])<time()){
        
$_SESSION=array();
        
header('location: '.__BASE."login.php?referer=".urlencode($_SERVER['PHP_SELF']));
        exit;
    }else{
        
$_SESSION['session_time']=time();
    } 
Que no es, ni más ni menos, que ir guardando en la sesión el timestamp de la última operación que se realizó, y si es mayor a un número dado (yo lo indco como $conf['session']['time']), entonces caduca.

Espero que te sea de ayuda.
Juas, me has matado, amigo.
No entendí nada del código xD Aún soy bastante cazurro.
No ejecuto en local, está colgado de mi página. En este caso se refiere al mantenimiento y administración, el cual sólo manejo yo, pero cuando meta área de usuarios habrá más gente con sesiones...

No se puede poner el recolector a 100%?
Quedando el script de esta manera:

Código PHP:
if (!isset($_SESSION) || empty($_SESSION))
{
ini_set("session.gc_probability","100"); //así 100 / 100 = 1 xD
ini_set("session.gc_maxlifetime","1200");
    
session_start();
}
if(empty(
$_SESSION['nombresesion']))
{
header("location:form_login.php");
exit;

  #4 (permalink)  
Antiguo 14/06/2008, 07:26
Avatar de almarin  
Fecha de Ingreso: junio-2008
Mensajes: 44
Antigüedad: 15 años, 10 meses
Puntos: 4
Respuesta: Duración de sesiones

Bueno, realmente da igual que el servidor esté colgado o sea local, el caso es que eres sólo tu quien accede al servidor. La probabilidad del gc_ se aplica sobre cada petición, y cuantas más peticiones tengas (más usuarios accedan), mayor será la probabilidad.

Con el código que has puesto, y poniendo el 100% de probabilidad, efectivamente el GC se ejecutará SIEMPRE, pero amigo, esto es una chapuza, porque eso cargará un montón tu servidor, y a pocas que tengas unas cuantas peticiones, el rendimiento lo vas a acusar bastante.

Si no entiendes el código que te puse, macho, es bien sencillo, símplemente guarda en la sesión el timestamp del último acceso, y lo vas comprobando en cada petición. Esto es muchísimo más liviano que estar llamando al GC en cada una de las peticiones, que como se suele decir, sería matar moscas a cañonazos

Saludos
  #5 (permalink)  
Antiguo 14/06/2008, 07:35
 
Fecha de Ingreso: marzo-2008
Mensajes: 96
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Duración de sesiones

Código PHP:
if (($_SESSION['session_time']+$conf['session']['time'])<time()){
        
$_SESSION=array();
        
header('location: '.__BASE."login.php?referer=".urlencode($_SERVER['PHP_SELF']));
        exit;
    }else{
        
$_SESSION['session_time']=time();
    } 
A ver, de este código entiendo lo de asignarle time() a la sesión llamada session_time.
Lo que no sé es qué es esto (negrita):
if (($_SESSION['session_time']+$conf['session']['time'])<time())
$_SESSION=array();
header('location: '.__BASE."login.php?referer=".urlencode($_SERVER['PHP_SELF']));


Si me lo pudieras explicar más detalladamente te lo agradecería ;)
  #6 (permalink)  
Antiguo 14/06/2008, 08:42
 
Fecha de Ingreso: marzo-2008
Mensajes: 96
Antigüedad: 16 años, 1 mes
Puntos: 0
Respuesta: Duración de sesiones

Bueno, he adaptado un poco el código y no me tira.
Al inicio de cada página hago un include del archivo funciones.php y en la segunda línea llamo a la función que controla todo este rollo.
La función dice así:
Código PHP:
function comosellame()
{
if (!isset(
$_SESSION) || empty($_SESSION))
{
    
session_start();
}
if(empty(
$_SESSION['nombresession']))
{
    
header("location:form_login.php");
    exit;
}
$tiempomax=30//Tiempo en segundos de la duración de la sesión.
if (($_SESSION['session_time']+$tiempomax)<time())
{
    
header("location:salir.php");
    exit;
}else{
    
$_SESSION['session_time']=time();
}  

Es decir, con este ejemplo, al de 30 segundos me tiraría a salir.php, la cual me destruye todas las sesiones... Pero algo he hecho mal que no pasa nada...

Edito: Si me tira bien, no había subido bien un archivo ;)
Gracias Almarin por todo ;)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:31.