PHP 8.1.31 Released!

session_destroy

(PHP 4, PHP 5, PHP 7, PHP 8)

session_destroyУничтожает зарегистрированные данные сессии

Описание

session_destroy(): bool

Функция 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();


?>

Смотрите также

Добавить

Примечания пользователей 3 notes

up
55
Praveen V
12 years ago
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)]
up
24
Jack Luo
10 years ago
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();

?>
up
-1
vitas dot lowang at gmail dot com
9 hours ago
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...
To Top