session_destroy
session_destroy() уничтожает все данные, связанные с текущей сессией. Данная функция не удаляет какие-либо глобальные переменные, связанные с сессией и не удаляет сессионные cookie. Чтобы вновь использовать переменные сессии, следует вызвать session_start() .
Замечание: Нет необходимости вызывать session_destroy() в обычном коде. Очищайте массив $_SESSION вместо удаления данных сессии.
Чтобы полностью удалить сессию, также необходимо удалить и её идентификатор. Если для передачи идентификатора сессии используются cookie (поведение по умолчанию), то сессионные cookie также должны быть удалены. Для этого можно использовать setcookie() .
При включённой опции session.use_strict_mode, вам не нужно удалять устаревшие cookie идентификатора сессии. В этом нет необходимости, потому что модуль сессии не примет cookie идентификатора сессии, если с этим идентификатором сессии нет связанных данных, и модуль сессии установит новый cookie идентификатора сессии. Рекомендуется включать опцию session.use_strict_mode для всех сайтов.
Внимание
Немедленное удаление сессии может привести к нежелательным последствиям. При наличии конкурирующих запросов, другие соединения могут столкнуться с внезапной потерей данных сессии, например, это могут быть запросы от JavaScript и/или запросы из ссылок URL.
Даже если текущий модуль сессии не поддерживает пустые cookie идентификатора сессии, немедленное удаление сессии может привести к пустым cookie идентификатора сессии из-за состояния гонки на стороне клиента (браузера). Это приведёт к тому, что клиент создаст множество идентификаторов сессии без необходимости.
Чтобы этого избежать, необходимо установить в $_SESSION временную метку удаления и убрать доступ позже. Или удостовериться, что ваше приложение не имеет конкурирующих запросов. Это также относится к session_regenerate_id() .
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.
Примеры
Пример #1 Уничтожение сессии с помощью $_SESSION
// Инициализируем сессию.
// Если вы используете session_name(«something»), не забудьте добавить это перед session_start()!
session_start ();
?php
// Удаляем все переменные сессии.
$_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 ();
?>
Смотрите также
- session.use_strict_mode
- session_reset() — Реинициализирует сессию оригинальными значениями
- session_regenerate_id() — Генерирует и обновляет идентификатор текущей сессии
- unset() — Удаляет переменную
- setcookie() — Отправляет cookie
User Contributed Notes 4 notes
11 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.
session_start ();
session_regenerate_id ( true );
?>
[Edited by moderator (googleguy at php dot net)]
9 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).
$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 ();
6 years ago
I’m using PHP 7.1 and received the following warning when implementing Example #1, above:
PHP message: PHP Warning: session_destroy(): Trying to destroy uninitialized session in.
What I discovered is that clearing $_SESSION and removing the cookie destroys the session, hence the warning. To avoid the warning while still keeping the value of using session_destroy(), do this after everything else:
if (session_status() == PHP_SESSION_ACTIVE)
2 years ago
All of a sudden neither session_destroy() nor $_SESSION=[] were sufficient to log out. I found the next to work:
setcookie ( session_name (), session_id (), 1 ); // to expire the session
$_SESSION = [];
?>
- Функции для работы с сессиями
- session_abort
- session_cache_expire
- session_cache_limiter
- session_commit
- session_create_id
- session_decode
- session_destroy
- session_encode
- session_gc
- session_get_cookie_params
- session_id
- session_module_name
- session_name
- session_regenerate_id
- session_register_shutdown
- session_reset
- session_save_path
- session_set_cookie_params
- session_set_save_handler
- session_start
- session_status
- session_unset
- session_write_close
- Copyright © 2001-2023 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy
Удаление сессий PHP
Стандартно в PHP сессии сохраняются в файлах. После окончания срока жизни сессии её файл удаляется. Но удаление выполняется с определённой вероятностью на «хитах». То есть при загрузке страниц сайта.
Если посещаемость сайта высока, а время жизни сессии достаточно большое, то объём всех файлов сессий может достигать десятков гигабайт. Очевидно, что в таких условиях на удаление старых сессии придётся потратить значительное время. И пользователь сайта не увидит страницу до тех пор, пока процедура не завершится.
Этой проблемы можно избежать, если отключить проверку сессий на хитах. И проводить её только на отдельной задаче, которая будет запускаться по CRON планировщику. Так пользователи не будут участвовать в процессе удаления старых сессий совсем. Что ускорит сайт.
Отключение проверки сессий на хитах
В конфигурационном файле apache для PHP можно прописать две директивы: session.gc_probability и session.gc_divisor. Они задают вероятность запуска процесса по удалению удаления старых сессий (на каждой 100-ой загрузке страницы сайта).
session.gc_divisor в сочетании с session.gc_probability определяет вероятность запуска функции сборщика мусора (gc, garbage collection) при каждой инициализации сессии. Вероятность рассчитывается как gc_probability/gc_divisor. То есть 1/100 означает, что функция gc запускается в одном случае из ста, или 1% при каждом запросе. session.gc_divisor по умолчанию имеет значение 100.
Для остановки стандартной функции удаления старых сессий достаточно задать session.gc_probability = 0. Делается это в файле .htaccess, в корневой директории сайта:
php_value session.gc_probability 0
Если добавить эту директиву и оставить всё как есть, то файлы сессий будут копиться до тех пор, пока весь диск хостинге не закончится. Поэтому нужно сделать свой механизм удаления сессий.
Удаление старых сессий по CRON заданию
Напишем CRON задание в файле /etc/crontab , в котором будет происходить весь процесс удаления просроченных файлов сессий. Приведём это задание сразу, а потом рассмотрим его составляющие (далее одна длинная-длинная строка задания):
0 * * * * mousedc /usr/bin/php -d session.save_path=/tmp/php_sessions/mousedc.ru -d session.gc_probability=1 -d session.gc_divisor=1 -d session.gc_maxlifetime=7776000 -r «session_start(); session_destroy();» &>/dev/null
- 0 * * * * — означает, что команда запускается раз в час
- mousedc — имя пользователя, запускающего команду. Должно совпадать с тем, от которого которого выполняются скрипты сайтов. Иначе доступа к сессионной папке у пользователя не будет, а без прав доступа скрипт не сработает.
- /usr/bin/php — обработчик php
- -d session.save_path=/tmp/php_sessions/mousedc.ru — директива, которая указывает на папку, где хранятся сессии сайта. Можно посмотреть её в phpinfo() в значении «session.save_path»
- «-d session.gc_probability=1» и «-d session.gc_divisor=1» — оба значения ставим одинаковыми, чтобы получить 100% вероятность срабатывания. Тогда при каждом запуске будет инициирован процесс удаления старых сессий
- -d session.gc_maxlifetime=7776000 — директива, определяющая максимальную продолжительность жизни сессии. Время жизни сессии — это количество секунд, прошедшее с последнего изменения сессионного файла. 7776000 секунд — это 90 дней. По умолчанию gc_maxlifetime = 1440. Задайте то значение, которое не меньше, чем используемое на сайте. Иначе сессии будут удаляться раньше, чем нужно.
- -r «session_start(); session_destroy();» — для инициации процесса очистки достаточно вызвать функцию создания сессии. А уничтожаем, чтобы и её файла не существовало.
- &>/dev/null — стирает оба потока вывода, чтобы ничего лишнего не записывалось в CRON журнал.
Как очистить session php
Сессии представляют набор переменных, которые хранятся на сервере (либо часть на сервере, а часть — в cookie браузера) и которые относятся только к текущему пользователю. В какой-то степени сессии являются альтернативой кукам в плане сохранения данных о пользователе.
Для запуска сессии необходимо вызвать функцию session_start() . Она должна вызываться до отправки ответа пользователю:
При запуске сессии с помощью функции session_start() , если пользователь первый раз заходит на сайт, PHP назначает ему уникальный идентификатор сессии. Этот идентификатор с помощью cookie, которые по умолчанию называются «PHPSESSID», сохраняется в браузере пользователя. С помощью этого идентификатора пользователь ассоциируется с данными сессии. Если для пользователя уже установлена сессия, то данная функция продлевает текущую сессию вместо установки новой.
С помощью специальных функций мы можем получить идентификатор сессии:
session_start(); echo session_id(); // идентификатор сессии echo session_name(); // имя - PHPSESSID
То же значение мы могли бы получить, обратившись к cookie напрямую:
echo $_COOKIE["PHPSESSID"];
Затем для сохранения или получения данных в сессии надо использовать глобальный ассоциативный массив $_SESSION . Сохранение переменной в сессии:
$_SESSION["имя_переменной"] = значение;
Получение сохраненного значения:
$переменная = $_SESSION["имя_переменной"];
Сохранение данных в сессии
Запустим сессию и сохраним в ней значения:
После установки сессии в браузере мы сможем заметить установку специальной куки, которая по умолчанию называется «PHPSESSID»:
SESSION» />SESSION» />
Получение данных сессии
Теперь получим эти значения и выведем на страницу:
session_start(); if (isset($_SESSION["name"]) && isset($_SESSION["age"])) < $name = $_SESSION["name"]; $age = $_SESSION["age"]; echo "Name: $name
Age: $age"; >Удаление данных сессии
Сессия уничтожается с закрытием браузера, однако мы также можем программно удалить либо какие-то отдельные, либо все данные сессии.
Для удаления одной переменной из сессии применяется функция unset() :
session_start(); unset($_SESSION["age"]); // удаляем из сессии переменную "age"
Удалить все данные сессии можно с помощью функции session_destroy() :
session_start(); session_destroy();
session_unset
Функция session_unset() удаляет все зарегистрированные переменные текущей сессии.
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.
Список изменений
Версия Описание 7.2.0 Теперь возвращаемый тип этой функции bool . Раньше был тип void . Примечания
Замечание:
При использовании $_SESSION для удаления переменных сессии, то используйте функцию unset() . Например, unset($_SESSION[‘varname’]); .
Предостережение
НЕ удаляйте весь массив $_SESSION с помощью unset($_SESSION) , так как это приведёт к невозможности регистрации новых переменных через суперглобальный массив $_SESSION
Замечание:
Использование функции session_unset() идентично $_SESSION = [] .
Предостережение
Функция работает только в том случае, если сессия активна. Она не очистит массив $_SESSION , если сессия ещё не запущена или уже уничтожена. Используйте $_SESSION = [] для удаления всех переменных сессии, даже если сессия не активна.
User Contributed Notes 4 notes
11 years ago
I was having a problem clearing all session variables, deleting the session, and creating a new session without leaving old session stuff behind in all browsers. The below code is perfect for a logout script to totally delete everything and start new. It even works in Chrome which seems to not work as other browsers when trying do logout and start a new session.
session_start ();
session_unset ();
session_destroy ();
session_write_close ();
setcookie ( session_name (), » , 0 , ‘/’ );
session_regenerate_id ( true );
?>8 years ago
The difference between both session_unset and session_destroy is as follows:
session_unset just clears out the session for usage. The session is still on the users computer. Note that by using session_unset, the variable still exists. session_unset just remove all session variables. it does not destroy the session. so the session would still be active.
Using session_unset in tandem with session_destroy however, is a much more effective means of actually clearing out data. As stated in the example above, this works very well, cross browser. session_destroy is destroy the session. session_destroy() to kill all session information. This is the more secure function to use.
18 years ago
note to Jason: I don’t know the exact mechanics of it (since I’m quite new to sessions) but I think you need to use session_unset() BEFORE you can use session_destroy() at all. I thought that session_unset() was for scripted variables, and session_destroy() just for anything saved on your side regarding the session.
18 years ago
The difference between both session_unset and session_destroy is as follows:
session_unset just clears out the sesison for usage. The session is still on the users computer. Note that by using session_unset, the variable still exists.
Using session_unset in tandem with session_destroy however, is a much more effective means of actually clearing out data. As stated in the example above, this works very well, cross browser:
I noticed that in firefox, one could simply use sesison_unset and the session would be cleared. When trying this on IE, I was horrified to find out that the data was still there, so I had to use session destroy.
- Функции для работы с сессиями
- session_abort
- session_cache_expire
- session_cache_limiter
- session_commit
- session_create_id
- session_decode
- session_destroy
- session_encode
- session_gc
- session_get_cookie_params
- session_id
- session_module_name
- session_name
- session_regenerate_id
- session_register_shutdown
- session_reset
- session_save_path
- session_set_cookie_params
- session_set_save_handler
- session_start
- session_status
- session_unset
- session_write_close
- Copyright © 2001-2023 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy