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)
3 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-2024 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy
Как правильно уничтожить сессию?
Warning: session_destroy() [function.session-destroy]: Trying to destroy uninitialized session in Z:\home\registr\www\test\exit.php on line 3 Warning: Cannot modify header information — headers already sent by (output started at Z:\home\registr\www\test\exit.php:1) in Z:\home\registr\www\test\exit.php on line 4
Почему так?
Отслеживать
задан 30 авг 2012 в 12:44
145 3 3 золотых знака 9 9 серебряных знаков 20 20 бронзовых знаков
@Анна, Чтобы отформатировать код, выделите его мышью и нажмите на кнопку 101010 редактора.
30 авг 2012 в 12:453 ответа 3
Сортировка: Сброс на вариант по умолчанию
На момент выполнения session_destroy у вас сессия не активна и соответственно генерируется WARNING. Перед вызовом session_destroy необходимо добавить вызов session_start .
Если у вас после session_destroy сразу идет редирект то удалять данные из глобальной переменной $_SESSION не обязательно, данные в ней будут доступны только на текущем запросе.
Отслеживать
ответ дан 30 авг 2012 в 13:41
1,126 5 5 серебряных знаков 7 7 бронзовых знаковсделала так, как вы..получилось вот что Warning: session_start() [function.session-start]: Cannot send session cache limiter — headers already sent (output started at Z:\home\registr\www\test\exit.php:1) in Z:\home\registr\www\test\exit.php on line 2
30 авг 2012 в 13:45
Только не забываем exit; после header: location 🙂 Иначе пойдет дальнейшее выполнение скрипта и редирект произойдет после полной отработки. При удалении $_SESSION[‘name’] еще и ошибки будут.
30 авг 2012 в 13:46
так как же построить обработчик закрытия сессии.
30 авг 2012 в 13:53
У вас перед вызовом session_start есть вывод (Z:\home\registr\www\test\exit.php, строка 1).
30 авг 2012 в 14:18
session_start() в начале скриптов находится.. о каком выводе вы говорите?
30 авг 2012 в 14:25Хедер срабатывает потому что скрипт уже отдал тексты ошибок. Хедеры действуют только до отдачи какого-либо текста клиенту, поэтому после выброса ошибок хэдеры не отправляются (это ваше второе предупреждение). А по первому — просто используйте сначала session_destroy() , а потом как угодно сбивайте $_SESSION 🙂
Отслеживать
ответ дан 30 авг 2012 в 12:50
2,828 14 14 серебряных знаков 18 18 бронзовых знаковто есть session_destroy(); unset($_SESSION[name]); header(‘Location: index.php’); просто местами поменять? но тоже самое получилось(
30 авг 2012 в 12:53
удаление сессии и по всей видимости у вас перед
header('Location: index.php');имеется какой-то вывод пользователю. echo ?
Отслеживать
ответ дан 30 авг 2012 в 13:10
Александр Молофеев Александр Молофеев
2,346 14 14 серебряных знаков 19 19 бронзовых знаковsession_start(); запускается при авторизации пользователя, на index.php возвращаемся на главую стрнацу.. только я так и не поняла в чем ошибка..
30 авг 2012 в 13:21
session_start(); вызывается не только при авторизации пользователя. она должна вызываться чуть ли не самой первой при каждой загрузке страницы для всех пользователей как авторизованных так и нет. и видимо вам будет много проще сделать loguot на аяксах: выйтиа> или без аякса вовсе: выйтиа> а в loguot.php: session_start(); session_destroy(); $_SESSION=array(); // unset($_SESSION[key]); etc.. header(‘location: /index.php’);
Управление сессиями
There is a nuance we found with session timing out although the user is still active in the session. The problem has to do with never modifying the session variable.
The GC will clear the session data files based on their last modification time. Thus if you never modify the session, you simply read from it, then the GC will eventually clean up.
To prevent this you need to ensure that your session is modified within the GC delete time. You can accomplish this like below.
if( !isset( $_SESSION [ ‘last_access’ ]) || ( time () — $_SESSION [ ‘last_access’ ]) > 60 )
$_SESSION [ ‘last_access’ ] = time ();
?>This will update the session every 60s to ensure that the modification date is altered.
- Модули для работы с сессиями
- Сессии
- Copyright © 2001-2024 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy
Как очистить session php
Для понимания, как удалить определенную сессию, нам понадобится:
Пример удаления сессии при перезагрузке
Скачать данный пример удаления сессии при перезагрузке.
Процесс удаления определенной сессии
Наша определенная сессия будет выглядеть так:
$_SESSION[«PRIMER»] = 1;
Подробнее о создании сессии см. -> здесьРазрушить/удалить определённую сессию можно несколькими способами:
Один из вариантов использовать unset
unset($_SESSION[«PRIMER»]);
Иногда по неизвестным причинам функция unset отказывается работать! Тогда можно воспользоваться таким способом:
$_SESSION[«PRIMER»]=»»;
Скрипт/код удаления определенной сессии -> перезагрузка
Далее разберем скрипт, который у нас присутствует в примере удаления определенной сессии при перезагрузке:
В самом верху страницы мы должны запустить сессию :
session_start();
Создаем условие, в первой части проверяем есть ли сессия PRIMER, если существует, то удаляем сессию, и длаее, если сессия удалена выводим результат в удаления сессии в переменную.
if ($_SESSION[‘PRIMER’])
<
$_SESSION[‘PRIMER’]=»;
if (!$_SESSION[‘PRIMER’]) < $rezult = 'Сессия $_SESSION[PRIMER] удалена'; >
>Далее. иначе , если сессия не существует, то выводим сообщение, что сессию нельзя удалить, потому, что она не существует.
else
<
$rezult = ‘Нельзя удалить то, что не существует! Нужно создать сессию ;’;
>Результат удаления определенной сессии будет выведен ниже в html коде с помощью echo
И собственно, как будет удаляться сессия при перезагрузке!?
Как только вы зайдете на страницу с данным скриптом, то сессия будет автоматически удалена, если она существует, на что и будет выведен результат!
Соберем весь код удаления определенной сессии: