2010-06-18 20 views
44

Estoy creando una sesión cuando un usuario inicia una sesión en modo:PHP descanso de sesión

$_SESSION['id'] = $id; 

¿Cómo puedo especificar un tiempo de espera de la sesión de X minutos y luego tener que realizar una función o una página de redirección una vez ha llegado a X minutos ??

EDITAR: Olvidé mencionar que necesito que la sesión expire debido a inactividad.

+9

posible duplicado de [¿Cómo expiraré una sesión PHP después de 30 minutos?] (Http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30- minutos) – Kzqai

Respuesta

86

primera, almacenar la última vez que el usuario realiza una solicitud

<?php 
    $_SESSION['timeout'] = time(); 
?> 

en la solicitud posterior, comprobar cuánto tiempo hace que hicieron su solicitud anterior (10 minutos en este ejemplo)

<?php 
    if ($_SESSION['timeout'] + 10 * 60 < time()) { 
    // session timed out 
    } else { 
    // session ok 
    } 
?> 
+20

Pero la sesión puede agotar el tiempo de espera antes de eso, si el tiempo de espera de sesión predeterminado en su PHPINI es más corto que el tiempo que eligió El tiempo de espera suele ser inferior a una hora por defecto. Si no desea que el cliente controle el tiempo de espera, necesita combinar este código con un ini_set de session.cookie_lifetime. Esta respuesta tampoco maneja el caso donde un cliente borra sus cookies. – Olhovsky

+2

El valor predeterminado de PHP es '0', que significa: "Hasta que se cierre el navegador". Si el navegador elimina la cookie, la '' $ _SESSION ['timeout'] 'var no se establecerá en primer lugar. Sin embargo, omití todas las otras cosas de gestión de sesión porque esta pregunta solo pregunta sobre el tiempo de espera. – Jacco

42

Cuando caduque la sesión los datos ya no está presente, así que algo como

if (!isset($_SESSION['id'])) { 
    header("Location: destination.php"); 
    exit; 
} 

redireccionará cada vez que la sesión ya no está activo.

Puede ajustar el tiempo que la cookie de sesión está vivo usando session.cookie_lifetime

ini_set("session.cookie_lifetime","3600"); //an hour 

EDIT: Si está cronometrando sesiones debido a la preocupación de la seguridad (en lugar de conveniencia,) utiliza la respuesta aceptada, como los comentarios a continuación show, esto es controlado por el cliente y, por lo tanto, no es seguro. Nunca pensé en esto como una medida de seguridad.

+1

tiene que eliminar las cotizaciones alrededor de $ _SESSION ['id'] –

+0

Aunque su respuesta no es la de votación, su solución parece más segura, mi pregunta es la siguiente, ¿debería establecer ese tiempo de espera de sesión en cada página? Supongo que tendría sentido, ya que querría que se reiniciara cada vez? En segundo lugar, ¿tiene que hacer session_start para cada página para obtener datos de la sesión, o solo una vez para iniciarla? Gracias – nagates

+10

Existen algunos problemas con la vida útil de la cookie de sesión, sobre todo, depende del * cliente * para aplicarla. La duración de la cookie está ahí para permitir que el cliente limpie las cookies inútiles/caducadas, no debe confundirse con nada relacionado con la seguridad. – Jacco

0
session_cache_expire(20); 
    session_start(); // NEVER FORGET TO START THE SESSION!!! 
    $inactive = 1200; //20 minutes *60 
    if(isset($_SESSION['start'])) { 
$session_life = time() - $_SESSION['start']; 
if($session_life > $inactive){ 
    header("Location: user_logout.php"); 
} 
    } 
    $_SESSION['start'] = time(); 

    if($_SESSION['valid_user'] != true){ 
    header('Location: ../....php'); 
    }else{ 

fuente: http://www.daniweb.com/web-development/php/threads/124500

+1

Solo buscar en Google la primera respuesta que encuentre y pegarla en Stack Overflow no es propicia para el objetivo de este sitio. Además, session_cache_expire() no tiene nada que ver con la duración de la sesión, por lo que la respuesta que pegó tiene información incorrecta. –

+0

@DavidBradbury De forma predeterminada, la cookie almacena el session_id, si la cookie caduca, el session_id no puede accederse cuando el cliente lo solicita. –

5

Simplemente marque primero la sesión no es alrea dy creado y si no crear uno. Aquí estoy configurando solo por 1 minuto.

<?php 
    if(!isset($_SESSION["timeout"])){ 
    $_SESSION['timeout'] = time(); 
    }; 
    $st = $_SESSION['timeout'] + 60; //session time is 1 minute 
?> 

<?php 
    if(time() < $st){ 
    echo 'Session will last 1 minute'; 
    } 
?> 
2
<script type="text/javascript"> 
window.setTimeout("location=('timeout_session.htm');",900000); 
</script> 

En la cabecera de cada página ha estado trabajando para mí durante las pruebas de sitio (el sitio no está aún en producción). La página HTML que corresponde termina la sesión y simplemente informa al usuario de la necesidad de iniciar sesión de nuevo. Esto parece una manera más fácil que jugar con la lógica de PHP. Me encantaría hacer algunos comentarios sobre la idea. ¿Alguna trampa que no haya visto en ella?

+4

No todo el mundo usa js – chuckieDub

+0

Si tiene varias pestañas abiertas con el mismo sitio, debe actualizarlas todas para crear una actividad; de lo contrario, si continúa trabajando en 1 pestaña, otras mostrarán "timeout_session.htm" después del tiempo de espera. Muy frustrante, especialmente si "timeout_session.htm" es la sesión de desarmado/destrucción. =) –

1
<?php 
session_start(); 

if (time()<$_SESSION['time']+10){ 
$_SESSION['time'] = time(); 
echo "welcome old user"; 
} 

else{ 
session_destroy(); 
session_start(); 
$_SESSION['time'] = time(); 
echo "welcome new user"; 
} 
?> 
0
<?php 
session_start(); 
if($_SESSION['login'] != 'ok') 
    header('location: /dashboard.php?login=0'); 

if(isset($_SESSION['last-activity']) && time() - $_SESSION['last-activity'] > 600) { 
    // session inactive more than 10 min 
    header('location: /logout.php?timeout=1'); 
} 

$_SESSION['last-activity'] = time(); // update last activity time stamp 

if(time() - $_SESSION['created'] > 600) { 
    // session started more than 10 min ago 
    session_regenerate_id(true); // change session id and invalidate old session 
    $_SESSION['created'] = time(); // update creation time 
} 
?> 
+0

Asegúrese de comentar su respuesta y explicar dónde y cómo está agregando el tiempo de espera. – Rias

1

solución Byterbit es problemático porque:

  1. tener la expiración de control del cliente de una galleta del lado del servidor es un problema de seguridad.
  2. si el tiempo de espera de expiración establecido en el lado del servidor es menor que el tiempo de espera configurado en el lado del cliente, la página no reflejará el estado real de la cookie.
  3. aunque por comodidad en la etapa de desarrollo, esto es un problema porque no reflejará el comportamiento correcto (en el tiempo) en la etapa de liberación.

para cookies, estableciendo la caducidad a través de session.cookie_lifetime es la solución correcta en cuanto a diseño y seguridad. para caducar la sesión, puede usar session.gc_maxlifetime.

caducar las cookies invocando session_destroy puede generar resultados impredecibles porque es posible que ya hayan caducado.

hacer el cambio en php.ini también es una solución válida, pero hace que la caducidad sea global para todo el dominio, lo que podría no ser lo que realmente desea; algunas páginas pueden optar por conservar algunas cookies más que otras.