Je dois garder une session en vie pendant 30 minutes, puis la détruire.
Réponses
Trop de publicités?Vous devez implémenter un délai d'expiration de session de votre propre. Les deux options mentionnées par les autres (session.gc_maxlifetime et session.cookie_lifetime) ne sont pas fiables. Je vais vous expliquer les raisons.
D'abord:
session.gc_maxlifetime
session.gc_maxlifetime spécifie le nombre de secondes après lequel les données seront considérées comme des "déchets" et nettoyé. La collecte des ordures se produit au cours de démarrage de la session.
Mais le garbage collector est seulement commencé avec une probabilité de session.gc_probability divisé par session.gc_divisor. Et en utilisant les valeurs par défaut de ces options (1 et 100, respectivement), la chance est seulement à 1%.
Eh bien, vous pourriez tout simplement d'ajuster ces valeurs de façon à ce que le garbage collector est commencé plus souvent. Mais lorsque le garbage collector est démarré, il va vérifier la validité de chaque session enregistrée. Et c'est coûteux.
En outre, lors de l'utilisation de PHP par défaut de la session.save_handler fichiers, les données de session sont stockées dans des fichiers dans un chemin d'accès spécifié dans la session.save_path. Avec ce gestionnaire de session, l'âge de la session de données est calculée sur la date de dernière modification et pas la dernière date d'accès:
Remarque: Si vous utilisez la valeur par défaut du fichier de base de gestionnaire de session, votre système de fichiers doit garder la trace de temps d'accès (atime). Windows GRAISSE de sorte que vous devrez trouver un autre moyen de gérer les déchets de la collecte de votre session si vous êtes coincé avec un système de fichiers FAT ou tout autre système de fichier où atime de suivi n'est pas disponible. Depuis PHP 4.2.3 il a utilisé mtime (date de modification) au lieu de atime. Ainsi, vous n'aurez pas de problèmes avec les systèmes de fichiers où atime de suivi n'est pas disponible.
Donc, en outre, il peut arriver qu'une session de fichier de données est supprimée pendant la session elle-même est encore considérée comme valable, car les données de la session n'a pas été mis à jour récemment.
Et la deuxième:
session.cookie_lifetime
session.cookie_lifetime spécifie la durée de vie du cookie dans les secondes qui est envoyé au navigateur. [...]
Oui, c'est vrai. Cela n'affecte que la durée de vie du cookie et la session elle-même peut encore être valide. Mais c'est le travail du serveur d'invalider une session, pas le client. Donc cela n'aide pas quelque chose. En fait, avoir de la session.cookie_lifetime ensemble d' 0
ferait de la session cookie d'un vrai cookie de session qui n'est valable que jusqu'à ce que le navigateur est fermé.
Conclusion / la meilleure solution:
La meilleure solution est de mettre en place un délai d'expiration de session de votre propre. L'utilisation d'un simple timbre de temps qui indique l'heure de la dernière activité (p. ex. la demande) et de le mettre à jour à chaque demande:
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
// last request was more than 30 minutes ago
session_unset(); // unset $_SESSION variable for the run-time
session_destroy(); // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp
Mettre à jour les données de session à chaque demande également de modifier la session de modification du fichier, la date de sorte que la session n'est pas supprimé par le garbage collector prématurément.
Vous pouvez aussi utiliser un timbre de temps pour régénérer l'ID de session régulièrement pour éviter les attaques sur les sessions comme la fixation de session:
if (!isset($_SESSION['CREATED'])) {
$_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
// session started more than 30 minutes ago
session_regenerate_id(true); // change session ID for the current session and invalidate old session ID
$_SESSION['CREATED'] = time(); // update creation time
}
Notez que session.gc_maxlifetime
doit être au moins égale à la durée de vie de cette coutume expiration gestionnaire (1800 dans cet exemple).
Façon simple d'expiration de la session PHP en 30 minutes.
Note: si vous voulez changer l'heure, changez simplement le 30 avec l'heure désirée et ne changez pas * 60: cela donnera les minutes.
En quelques minutes: (30 * 60)
En jours: (n * 24 * 60 * 60) n = non de jours
Login.php
<?php
session_start();
?>
<html>
<form name="form1" method="post">
<table>
<tr>
<td>Username</td>
<td><input type="text" name="text1"></td>
</tr>
<tr>
<td>Password</td>
<td><input type="password" name="pwd"></td>
</tr>
<tr>
<td><input type="submit" value="SignIn" name="submit1"></td>
</tr>
</table>
</form>
</html>
<?php
if ($_POST['submit1']) {
$v1 = "FirstUser";
$v2 = "MyPassword";
$v3 = $_POST['text'];
$v4 = $_POST['pwd'];
if ($v1 == $v3 && $v2 == $v4) {
$_SESSION['luser'] = $v1;
$_SESSION['start'] = time(); // Taking now logged in time.
// Ending a session in 30 minutes from the starting time.
$_SESSION['expire'] = $_SESSION['start'] + (30 * 60);
header('Location: http://localhost/somefolder/homepage.php');
} else {
echo "Please enter the username or password again!";
}
}
?>
HomePage.php
<?php
session_start();
if (!isset($_SESSION['luser'])) {
echo "Please Login again";
echo "<a href='http://localhost/somefolder/login.php'>Click Here to Login</a>";
}
else {
$now = time(); // Checking the time now when home page starts.
if ($now > $_SESSION['expire']) {
session_destroy();
echo "Your session has expired! <a href='http://localhost/somefolder/login.php'>Login here</a>";
}
else { //Starting this else one [else1]
?>
<!-- From here all HTML coding can be done -->
<html>
Welcome
<?php
echo $_SESSION['luser'];
echo "<a href='http://localhost/somefolder/logout.php'>Log out</a>";
?>
</html>
<?php
}
}
?>
LogOut.php
<?php
session_start();
session_destroy();
header('Location: http://localhost/somefolder/login.php');
?>
Est-ce pour déconnecter l'utilisateur après un certain temps? Réglage de la session de la création (ou date d'expiration) lorsqu'il est enregistré, et puis de vérifier qu'à chaque chargement de la page peut gérer cela.
E. g.:
$_SESSION['example'] = array('foo' => 'bar', 'registered' => time());
// later
if ((time() - $_SESSION['example']['registered']) > (60 * 30)) {
unset($_SESSION['example']);
}
Edit: j'ai un sentiment que vous dire autre chose.
Vous pouvez mettre à la casse séances, après une certaine durée de vie à l'aide de la session.gc_maxlifetime
paramètre ini:
Edit: la fonction ini_set('session.gc_maxlifetime', 60*30);
Il est effectivement facile avec une fonction comme suit. Il utilise la base de données nom de la table "sessions" avec les champs " id " et "temps".
Chaque fois que l'utilisateur visite votre site ou d'un service nouveau, vous devez appeler cette fonction pour vérifier si sa valeur de retour est TRUE. Si c'est FALSE, l'utilisateur a expiré et que la session sera détruite (Remarque: Cette fonction utilise une base de données de la classe pour se connecter et d'interroger la base de données, bien sûr, vous pourriez aussi le faire à l'intérieur de votre fonction ou quelque chose comme ça):
function session_timeout_ok() {
global $db;
$timeout = SESSION_TIMEOUT; //const, e.g. 6 * 60 for 6 minutes
$ok = false;
$session_id = session_id();
$sql = "SELECT time FROM sessions WHERE session_id = '".$session_id."'";
$rows = $db->query($sql);
if ($rows === false) {
//Timestamp could not be read
$ok = FALSE;
}
else {
//Timestamp was read succesfully
if (count($rows) > 0) {
$zeile = $rows[0];
$time_past = $zeile['time'];
if ( $timeout + $time_past < time() ) {
//Time has expired
session_destroy();
$sql = "DELETE FROM sessions WHERE session_id = '" . $session_id . "'";
$affected = $db -> query($sql);
$ok = FALSE;
}
else {
//Time is okay
$ok = TRUE;
$sql = "UPDATE sessions SET time='" . time() . "' WHERE session_id = '" . $session_id . "'";
$erg = $db -> query($sql);
if ($erg == false) {
//DB error
}
}
}
else {
//Session is new, write it to database table sessions
$sql = "INSERT INTO sessions(session_id,time) VALUES ('".$session_id."','".time()."')";
$res = $db->query($sql);
if ($res === FALSE) {
//Database error
$ok = false;
}
$ok = true;
}
return $ok;
}
return $ok;
}