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 — Уничтожает зарегистрированные данные сессии
Функция session_destroy() уничтожает файл с данными текущей сессии. Функция не удаляет глобальные переменные сессии, и не удаляет сессионный блок данных cookie. Повторный вызов функции session_start() создаст новый файл данных сессии, чтобы снова сохранять и извлекать переменные сессии.
Замечание: Функцию session_destroy() не вызывают в рабочем коде. Вместо уничтожения данных сессии очищают суперглобальный массив $_SESSION.
Вместе с удалением данных сессии удаляют и идентификатор сессии, чтобы убить саму сессию. При поведении по умолчанию, при котором идентификатор сессии передаётся через cookie, сессионные cookie также требуется удалить. Для этого вызывают функцию setcookie().
При включённой опции session.use_strict_mode устаревший блок данных cookie с идентификатором сессии не удаляют, поскольку модуль сессии не будет принимать и устанавливать новый блок данных cookie с идентификатором сессии, если с идентификатором сессии не связали данные. Разработчики PHP рекомендуют включать опцию session.use_strict_mode на рабочих сайтах.
Немедленное удаление сессии иногда даёт нежелательные результаты. При одновременных запросах другие соединения сталкиваются с внезапной потерей данных сессии. К таким запросам, например, относятся JavaScript-запросы и (или) запросы, которые отправляет браузер при переходе по ссылкам на URL-адреса.
Текущий модуль сессии хотя и не принимает блок данных cookie с пустым идентификатором сессии, немедленное удаление сессии из-за состояния гонки на стороне клиента (браузера) иногда создаёт cookie с пустым идентификатором сессии, из-за чего клиент создаёт серию ненужных идентификаторов сессии.
На клиенте не появятся условия гонки и клиент не создаст ненужные идентификаторы сессии, если установить в массиве $_SESSION временну́ю метку удаления сессии, а позже отклонить доступ к старому идентификатору сессии, или убедиться, что приложение не создаёт параллельные запросы. Это предупреждение также относится к функции session_regenerate_id().
У этой функции нет параметров.
Функция возвращает true
в случае успешного выполнения или false
, если возникла ошибка.
Пример #1 Пример уничтожения сессии через суперглобальный массив $_SESSION
<?php
// Инициализируем сессию
// При установке пользовательского названия сессии перед вызовом функции session_start()
// не забудьте вызывать session_name("something")!
session_start();
// Удаляем все переменные сессии
$_SESSION = array();
// Если нужно убить сессию, также удаляем сессионный блок данных cookie.
// Замечание: Это уничтожит сессию, а не только данные сессии!
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(
session_name(),
'',
time() - 42000,
$params["path"],
$params["domain"],
$params["secure"],
$params["httponly"]
);
}
// Наконец, уничтожаем сессию
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();
?>