php Механизм записи/хранения/удаления данных о сессии. Разница между unset($_COOKIE) и session_destroy()
Primary tabs
Для удаления данных о сессии Д.Котеров рекомендует выполнять данную последовательность действий:
//Очистить данные сессии для текущего сценария: $_SESSION = []; //Удалить cookie, соответствующую id: @unset($_COOKIE[session_name()]); //удалить хранилище сессии: session_destroy();
Чтобы понять, почему обязательно разбивать удаление сессии на 3 этапа, давайте разберёмся, что вообще где существует и куда сохраняется.
Для наглядности определим все места, где хранятся всевозможные данные о сессии:
- Суперглобальный массив $_SESSION.
Создаётся при старте сессии session_start(). Это только переменная скрипта, которая доступна только на протяжении работы скрипта и НЕ хранится в хранилище на сервере, а хранится в оперативной памяти (а значит исчезает после очередного выполнения скрипта, инициализируясь вновь из хранилища при очередном обращении к серверу).У Котерова:
При завершении сценария PHP автоматически сохраняет массив $_SESSION во временном хранилище, имя которого хранится в SID
имеется ввиду, что в хранилище записываются данные из массива $_SESSION, если таковые в нём имеются.
- Кука SID.
Создаётся при старте сессии session_start(). Хранит данные о местоположении хранилища данных о сессии данного пользователя. Удаляется только при принудительной чистке куков. -
И наконец, Хранилище данных сессии.
Создаётся при старте сессии вызовом функции session_start(). Хранилище располагается на сервере (там где работает ваш php скрипт).
В него записываются данные из массива $_SESSION, если они там есть/появляются. Удаляются данные из него только при вызове session_destroy().
Данное хранилище продолжает сущелствовать на сервере даже после того, как очередной запрос от пользователя получил ответ, т.е. скрипт завершил свою работу.
Т.е. можно сказать, что:
- В php-скрипте работать с данными сессии можно через массив $_SESSION
- $_SESSION является "маской" для хранилища сессии и хотя запись в этот массив приводит к записи в хранилище, удаление массива само по себе не уничтожает данные в хранилище.
- удалив массив, вы потеряете доступ к данным сессии только в текущем вызове скрипта, но в следующем он будет вновь иницилизирован (восстанет из пепла), если дополнительно не очистить хранилище.
Таким образом
Если session_destroy() не будет вызвана, и не будут очищены куки, то при новом запуске скрипта, данные из хранилища, записанные в него ранее, появятся в $_SESSION, даже если при этом запуске скрипта, вручную в $_SESSION вы их не добавите.
Итак,
// Эту строку пишем, чтобы очистить данные о сессии в текущем запуске скрипта $_SESSION = []; //Эта строка удаляет SID @unset($_COOKIE[session_name()]); //Удаляет хранилище сессии: session_destroy();
Источники
- Д.Котеров "PHP7 в подлиннике" стр.625 - 627
- php.net - session_destroy()
- Log in to post comments
- 7349 reads
vedro-compota
Wed, 05/02/2018 - 14:16
Permalink
по поводу хранилища
Изменено на (что правильно, хранилище находится на сервере, а не на компе пользователя):
_____________
матфак вгу и остальная классика =)
melisa
Thu, 05/03/2018 - 15:53
Permalink
спасибо
спасибо
vedro-compota
Sat, 09/01/2018 - 15:27
Permalink
отличная статья)
отличная статья)
_____________
матфак вгу и остальная классика =)
vedro-compota
Wed, 10/10/2018 - 16:41
Permalink
блокировка сессий
О проблеме блокировки сессий при хранении в файлах: http://fkn.ktu10.com/?q=node/10487
_____________
матфак вгу и остальная классика =)