If you want to change the session id on each log in, make sure to use session_regenerate_id(true) during the log in process.
<?php
session_start();
session_regenerate_id(true);
?>
[Edited by moderator (googleguy at php dot net)]
(PHP 4, PHP 5, PHP 7, PHP 8)
session_destroy — Détruit une session
session_destroy() détruit toutes les données associées à la session courante. Cette fonction ne détruit pas les variables globales associées à la session, de même, elle ne détruit pas le cookie de session. Pour accéder à nouveau aux variables de session, la fonction session_start() doit être appelée de nouveau.
Note: Vous n'avez pas besoin d'appeler session_destroy() depuis le programme généralement. Nettoyer le tableau $_SESSION plutôt que de détruire les données de session.
Pour détruire complètement une session, l'identifiant de la session doit également être effacé. Si un cookie est utilisé pour propager l'identifiant de session (comportement par défaut), alors le cookie de session doit être effacé. La fonction setcookie() peut être utilisée pour cela.
Quand session.use_strict_mode est activé. Vous n'avez pas besoin d'effacer le cookies d'ID de session obsolète car le module de session n'accepte pas les cookies d'ID de sessions quand il n'y a pas données associer avec ces ID de sessions et définira un nouvel cookie d'ID de session. Activer session.use_strict_mode est recommandé pour tous les sites.
La suppression immédiate d'une session peut causer des résultats inattendus. Quand il y a des requêtes simultanées, les autres connexions peuvent soudainement perdre des données de session. Par exemple des requêtes depuis JavaScript et/ou des requêtes depuis des liens URL.
Bien que le module de session actuel n'accepte pas un cookie d'ID de session vide, mais la suppression immédiate de session peut provoquer un cookie d'ID de session vide à cause d'une condition de concurrence côté client (navigateur). Ceci provoquera la création de beaucoup d'ID de session inutile par le client.
Pour éviter ceci, vous devez définir un horodatage à $_SESSION et refuser l'accès à toutes les dates ultérieures. Ou assurer vous que votre application n'a pas de requêtes simultanées. Ceci s'applique aussi à session_regenerate_id().
Cette fonction ne contient aucun paramètre.
Exemple #1 Destruction d'une session avec $_SESSION
<?php
// Initialisation de la session.
// Si vous utilisez un autre nom
// session_name("autrenom")
session_start();
// Détruit toutes les variables de session
$_SESSION = array();
// Si vous voulez détruire complètement la session, effacez également
// le cookie de session.
// Note : cela détruira la session et pas seulement les données de session !
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// Finalement, on détruit la session.
session_destroy();
?>
If you want to change the session id on each log in, make sure to use session_regenerate_id(true) during the log in process.
<?php
session_start();
session_regenerate_id(true);
?>
[Edited by moderator (googleguy at php dot net)]
It took me a while to figure out how to destroy a particular session in php. Note I'm not sure if solution provided below is perfect but it seems work for me. Please feel free to post any easier way to destroy a particular session. Because it's quite useful for functionality of force an user offline.
1. If you're using db or memcached to manage session, you can always delete that session entry directly from db or memcached.
2. Using generic php session methods to delete a particular session(by session id).
<?php
$session_id_to_destroy = 'nill2if998vhplq9f3pj08vjb1';
// 1. commit session if it's started.
if (session_id()) {
session_commit();
}
// 2. store current session id
session_start();
$current_session_id = session_id();
session_commit();
// 3. hijack then destroy session specified.
session_id($session_id_to_destroy);
session_start();
session_destroy();
session_commit();
// 4. restore current session id. If don't restore it, your current session will refer to the session you just destroyed!
session_id($current_session_id);
session_start();
session_commit();
?>
I found out that in order to really have the session data cleared after calling session_destroy(), you need to refresh the page. For example by calling
header('Location: '.$_SERVER['PHP_SELF']."?page=profile");
if you don't then there are still data in $_SESSION which was there before. I don't know if this is intended behavior but it's kind of confusing IMO...