Foros del Web » Programando para Internet » PHP »

Expiración de Sesiones

Estas en el tema de Expiración de Sesiones en el foro de PHP en Foros del Web. Hola, estoy propagando las variables de una sesion a traves de un formulario que esta dividido en 5 paginas y el problema que tengo es ...
  #1 (permalink)  
Antiguo 26/12/2004, 12:41
Avatar de tralara  
Fecha de Ingreso: diciembre-2003
Mensajes: 230
Antigüedad: 20 años, 4 meses
Puntos: 0
Expiración de Sesiones

Hola, estoy propagando las variables de una sesion a traves de un formulario que esta dividido en 5 paginas y el problema que tengo es que no se como darle un tiempo de vida a la sesion.

Si antes de llegar al final del formulario se abandona la pagina y se regresa a ella tres horas mas tarde la sesion sigue activa, como lo puedo solucionar?

En el manual de PHP he visto session_cache_limiter y session_cache_expire pero no lo termino de tener muy claro.

Ejemplo:

llamo esta url sesion.php?x=HOLA

sesion.php contiene:

Código PHP:
<?
session_start
();
session_cache_expire(1);
$x $_GET['x'];
$_SESSION['x'] = $x;
header ("Location: sesionesII.php");
?>
y en sesionesII.php hay esto:
Código PHP:
<?

session_start
();
session_cache_expire(1);
if (
$_SESSION['x'] != ""){
echo 
$_SESSION['x'];
}else{
echo 
"Vacia";
}
?>
Pero por mas que racargo y recargo sesionesII.php jamas me imprime "Vacia" siempre me dice "HOLA".



Alguien puede indicarme como le doy un tiempo de vida a mi sesion?

Muchas gracias!
  #2 (permalink)  
Antiguo 26/12/2004, 12:52
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 20 años, 6 meses
Puntos: 11
El tiempo de vida de sesion comienza a contar desde que ya no se accede a la cookie. Revisa el archivo php.ini, puedes modificar este valor, esta dado en segundos

session.gc_maxlifetime = 1440

y este dado en minutos:

session.cache_expire = 180
  #3 (permalink)  
Antiguo 26/12/2004, 13:10
Avatar de tralara  
Fecha de Ingreso: diciembre-2003
Mensajes: 230
Antigüedad: 20 años, 4 meses
Puntos: 0
Gracias claudiovega, pero no tengo acceso al php.ini, como lo puedo hacer entonces?

No puedo declarar el valor del expire en mis paginas?
  #4 (permalink)  
Antiguo 26/12/2004, 14:00
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 20 años, 6 meses
Puntos: 11
Lei en la documentacion que session_cache_expire() debe usarse antes de session_start()

http://cl.php.net/manual/en/function...che-expire.php

The cache expire is reset to the default value of 180 stored in session.cache_limiter at request startup time. Thus, you need to call session_cache_expire() for every request (and before session_start() is called).
  #5 (permalink)  
Antiguo 26/12/2004, 14:23
Avatar de tralara  
Fecha de Ingreso: diciembre-2003
Mensajes: 230
Antigüedad: 20 años, 4 meses
Puntos: 0
Nada, aunque lo use antes de session_start() tampoco pierde los valores de la sesion!!!

Se supone que si en la pagina A abro una sesion y declaro que $_SESSION['x'] = "HOLA" y en la pagina B escribo algo asi:

Código PHP:
<?
session_cache_expire
(1);
session_start();
echo 
$_SESSION['x'];
?>
Pasado un minuto deberia imprimir "nada", no?

Heeeelp

Última edición por tralara; 26/12/2004 a las 14:27
  #6 (permalink)  
Antiguo 26/12/2004, 16:22
Avatar de tralara  
Fecha de Ingreso: diciembre-2003
Mensajes: 230
Antigüedad: 20 años, 4 meses
Puntos: 0
Muchach@s, ninguna otra idea?
  #7 (permalink)  
Antiguo 27/12/2004, 03:17
Avatar de tralara  
Fecha de Ingreso: diciembre-2003
Mensajes: 230
Antigüedad: 20 años, 4 meses
Puntos: 0
Nadie me puede guiar un poco con esto por favor?

Saludos
  #8 (permalink)  
Antiguo 27/12/2004, 07:34
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Pero .. a todo esto .. como propagas el SID?

El SID lo puedes propagar por el URL o por cookies.

En cuanto a tiempos de expiración es la directiva: session.gc_maxlifetime la que define en última instancia la validez de un SID creado (Identificador único de sesión). Ahora .. el SID como te he comentado se puede propagar por cookies o por el URL .. Si lo haces por cookies (lo más seguro y lo que "asumes" en tu código pues no se vé que lo hagas tu a mano en el código ...). Si propagas el SID en cookies, .. la cookie también tiene un tiempo de expiración que define "cuanto tiempo está en ese cliente el SID" .. si lo usas a "0" .. durará lo que el cliente tenga abiertas tus páginas de tu sitio .. si usas otros tiempos .. durante ese tiempo ( y siempre que sea menor que el que define gc_max....) podrás tomar denuevo tu SID válido y seguir usandolo.

El trabajo con seseiones se suele configurarar si propagas el SID en cookies con una vida de la cookie de "0" (segundos) .. es decir .. una cookie tipo "de sesión" .. al cerrar todas las ventanas de tu sitio el SID se pierde en el cliente que la creó y con ello en "enlace" con el servidor. Pese que el SID siga siendo válido en el "servidor" .. "nadie" conoce (el cliente que la creó) que ID tiene. Puedes combinar esto con un tiempo menor de session.gc_maxtimelife .. y será esta la propiedad que debes controlar si propagas el SID enteramente por el URL.

Algunas directivas de PHP en general se pueden modificar en tiempo de ejecución vía la función:

ini_set()

ejemplo:

ini_set("session.xxxxxx","valor");

(siempre antes de los session_Start() y otras funciones de PHP para sesiones).

Un saludo,
  #9 (permalink)  
Antiguo 27/12/2004, 09:03
Avatar de tralara  
Fecha de Ingreso: diciembre-2003
Mensajes: 230
Antigüedad: 20 años, 4 meses
Puntos: 0
Ok, ahora voy a estudiar todo esto, pero con lo que me comentas me surgen algunas dudas Cluster:

En mi formulario en ningun momento estoy propagando un SID, en cada pagina del formulario voy recogiendo unas variables que voy guardando en la sesion y que al final recojo en un archivo.txt final, despues vacio y destruyo la sesion, no lo creia necesario al no ser una zona de "cliente" digamos.

Entonces, me dices que para que las funciones session_cache_expire() y _limiter() tengan efecto sobre la session es imprescindible declarar el SID pues es a el a quien se refieren y no a la session en si?

O sea primero se debe nombrar la sesion, declarar el SID y entonces puedo manejar los tiempos de vida y eso siempre declarando una cookie?

Es muy importante para mi tener esto claro antes de ponerme a modificar lo que ya tengo funcionando.

Cuando hacemos:
Código PHP:
<?
session_start
();
?>
Tanto en el lado del cliente (navegador) como en el del servidor(direcotorio por defecto .tmp/ de la configuracion de PHP, etc) se genera automaticamente una cookie por defecto y que contiene por ejemplo:

Name: PHPSESSID
Content: g3c91jc5aqabq9ffa3h2rbvd66
Host: 127.0.0.1 (porque chequeo en local)
Path: /
Sendo For: Any type of connection
Expires: at end of session

Con esto intuyo que se ha creado un SID. Si borro esas cookies, asigna otro SID completamente distinto, si abro otro navegador tambien crea uno nuevo, con esto entiendo que cualquiera que abra la pagina por primera vez se asignara un nuevo SID (Identificador de Session) y que el tiempo de vida es el que indique la session, si no se indica nada por defecto toma el valor por defecto.

Cuando en la pagina A escribo esto:
Código PHP:
<?
session_start
();
$_SESSION['x'] = "variable";
header ("Location: B.php");
?>
Y en la pagina B estoy leyendolo asi:
Código PHP:
<?
session_start
();
echo 
$_SESSION['x'];
?>
Como se han propagado tanto ese SID por defecto y ['x], por la cookie?
O sea que podriamos decir que por defecto PHP propaga esa info por cookie(de la forma segura?), asi que hasta aqui no hay un problema de seguridad, no?
Seria incluso asi recomendable, hasta en una zona no especifica para clientes, declarar manualmente un SID?

En todo caso y para terminar se podria decir?

1. Para determinar el tiempo de vida de una sesion mediante session_cache_expire es imprescindible dar un nombre a la session y nombrar un SID.

2. Si no se cumple 1, hay que usar ini_set("session.cache_expire","valor"); para redefinir el valor por defecto para el tiempo de vida de las sesiones.

No habiendo en nigun caso un problema de seguridad añadido?


Bueno, gracias de verdad y a ver que sacamos de todo esto en claro!!

Saludos
  #10 (permalink)  
Antiguo 27/12/2004, 10:31
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
En mi formulario en ningun momento estoy propagando un SID, en cada pagina del formulario voy recogiendo unas variables que voy guardando en la sesion y que al final recojo en un archivo.txt final, despues vacio y destruyo la sesion, no lo creia necesario al no ser una zona de "cliente" digamos.
Ya lo estás haciendo aunque no sepas ni que es el concepto de "SID" (Identificador único de sesión) ..

Cita:
Entonces, me dices que para que las funciones session_cache_expire() y _limiter() tengan efecto sobre la session es imprescindible declarar el SID pues es a el a quien se refieren y no a la session en si?
No .. las funciones session_caché_expire() se refiere a laduración de la página en la caché de tu navegador (cliente) .. nada que ver con tiempos de expiración de la sesión .. y el session_cache_limiter() define si se hará o no caché o de que tipo para tus páginas donde uses sesiones (session_start()) ..

Cita:
O sea primero se debe nombrar la sesion, declarar el SID y entonces puedo manejar los tiempos de vida y eso siempre declarando una cookie?
No, todo eso ya lo hace PHP bajo el estado de las directivas de tu php.ini (lo puedes ver en tu caso haciendo un phpinfo() a tu servidor y viendo el valor de las session.xxxx directivas) .. entre ellas: session.gc_xxxx .. session.use_cookies .. etc.

más info: www.php.net/sesssion

Cita:
Es muy importante para mi tener esto claro antes de ponerme a modificar lo que ya tengo funcionando.
En las FAQ's de este foro y en la documentación oficial de PHP tienes la teoría de como funcionan las sesiones, que es el SID y lo que implica .. también el "por qué" es inspresindible que ese "SID" sea propagado entre tus scripts de tu aplicación .. ya sea por el URL (automáticamente por parte de pHP o manualmente) o bien en cookies.

Cita:
Como se han propagado tanto ese SID por defecto y ['x], por la cookie?
En tu caso si .. pero esto no se produce por "arte de magia" .. debes revisar haciendo a tu servidor un phpinfo() que valor tienen las directivas de sesiones que definen el método de propagación del SID

Cita:
1. Para determinar el tiempo de vida de una sesion mediante session_cache_expire es imprescindible dar un nombre a la session y nombrar un SID.
No, .. ya te comenté que no tiene nada que ver esa función (lo que hace) con lo que pretendes hacer. La directiva que principalmente controla el tiempo de expiración de una sesión ya te comenté en el anterior mensaje cual era y que se dá valor (si es que no tienes restringido hacerlo) vía la función ini_set()

Cita:
2. Si no se cumple 1, hay que usar ini_set("session.cache_expire","valor"); para redefinir el valor por defecto para el tiempo de vida de las sesiones.
Te hacía el comentario que esa función sólo cambiar el valor por defecto de tal directiva que ahí indiques para el tiempo de ejecución del script .. (y que esa directiva en cuestión no es la que debes alterar su valor).

Por lo demás .. las sesiones no se suelen definir tiempos de expiración mas allá de lo que dura tu usuario en tu sitio navegando páginas definindo la propagación del SID en cookies con tiempo de expiración 0 para la cookie (lo cual hace de la cookie tipo "sesion") y muere al cerrar la última ventana de tu sitio abierta. Todo esto en conjunto con session.gc_maxlifetime que es la que en última instancia la que manda sobre la validez del SID en curso.


Un saludo,
  #11 (permalink)  
Antiguo 27/12/2004, 11:18
Avatar de tralara  
Fecha de Ingreso: diciembre-2003
Mensajes: 230
Antigüedad: 20 años, 4 meses
Puntos: 0
Muchas gracias Cluster, ahora lo tengo del todo claro, creo que esto era basico:

Cita:
No .. las funciones session_caché_expire() se refiere a laduración de la página en la caché de tu navegador (cliente) .. nada que ver con tiempos de expiración de la sesión .. y el session_cache_limiter() define si se hará o no caché o de que tipo para tus páginas donde uses sesiones (session_start())
Por otro lado si que tenia claro el concepto de (Identificador único de sesión) y me mire el estado de PHP tambien.

En todo caso, te estoy sumamente agradecido pues todas tus explicaciones han despejado definitivamente mis dudas en cuanto a sessions se refiere, o como minimo en la teoria.

Longitudinales agradecimientos!
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 14:28.