web-dev-qa-db-fra.com

PHP Expiration de la session

Je crée une session lorsqu'un utilisateur se connecte de la manière suivante:

$_SESSION['id'] = $id;

Comment puis-je spécifier un délai d'expiration sur cette session de X minutes et lui demander ensuite d'exécuter une fonction ou une redirection de page une fois qu'il a atteint X minutes?

EDIT: J'ai oublié de mentionner que j'ai besoin de la session pour expirer en raison d'inactivité.

45
user342391

d'abord, stocke la dernière fois que l'utilisateur a fait une demande

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

dans la demande suivante, vérifiez depuis combien de temps ils ont fait leur demande précédente (10 minutes dans cet exemple)

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

Lorsque la session expire, les données ne sont plus présentes. Quelque chose comme:

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

sera redirigé chaque fois que la session n'est plus active.

Vous pouvez définir la durée de vie du cookie de session à l’aide de session.cookie_lifetime

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

EDIT: Si vous programmez la fin des sessions pour des raisons de sécurité (au lieu de votre commodité), utilisez la réponse acceptée, comme le montrent les commentaires ci-dessous, elle est contrôlée par le client et donc non sécurisée. Je n'ai jamais pensé à cela comme une mesure de sécurité.

43
Vinko Vrsalovic

Il suffit de vérifier d'abord que la session n'est pas déjà créée et sinon d'en créer un Ici, je le fixe pour 1 minute seulement.

<?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';
  }
?>
5
user1473910
<script type="text/javascript">
window.setTimeout("location=('timeout_session.htm');",900000);
</script>

Dans l'en-tête de chaque page a fonctionné pour moi pendant les tests du site (le site n'est pas encore en production). La page HTML à laquelle elle se termine termine la session et informe simplement l'utilisateur de la nécessité de se reconnecter. Cela semble être un moyen plus facile que de jouer avec la logique PHP . J'aimerais beaucoup commenter cette idée. Des pièges que je n'ai pas vus?

2
Byterbit
<?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";
}
?>
1
Uday Hiwarale

La solution de Byterbit est problématique parce que:

  1. l'expiration du contrôle client d'un cookie côté serveur est un problème de sécurité.
  2. si le délai d'expiration défini côté serveur est inférieur au délai défini du côté client, la page ne refléterait pas l'état réel du cookie.
  3. même si, pour le confort du stade de développement, cela pose un problème car il ne reflète pas le bon comportement (en ce qui concerne le timing) lors de la phase de publication.

pour les cookies, la définition de l’expiration via session.cookie_lifetime est la solution idéale en termes de conception et de sécurité! pour expirer la session, vous pouvez utiliser session.gc_maxlifetime.

expirer les cookies en appelant session_destroy peut générer des résultats imprévisibles car ils ont peut-être déjà expiré.

effectuer la modification du fichier php.ini est également une solution valable, mais elle confère une validité globale à l'expiration pour l'ensemble du domaine, ce qui pourrait ne pas être ce que vous voulez vraiment - certaines pages pourraient choisir de conserver certains cookies plus que d'autres.

1
Michael Badichi
    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{  

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

0
khaled_tn
<?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
Dominic Ceraso