php Механизм записи/хранения/удаления данных о сессии. Разница между unset($_COOKIE) и session_destroy()

Для удаления данных о сессии Д.Котеров рекомендует выполнять данную последовательность действий:

//Очистить данные сессии для текущего сценария:
$_SESSION = [];
//Удалить cookie, соответствующую id:
@unset($_COOKIE[session_name()]);
//удалить хранилище сессии:
session_destroy();

Чтобы понять, почему обязательно разбивать удаление сессии на 3 этапа, давайте разберёмся, что вообще где существует и куда сохраняется.

Для наглядности определим все места, где хранятся всевозможные данные о сессии:

  1. Суперглобальный массив $_SESSION.
    Создаётся при старте сессии session_start(). Это только переменная скрипта, которая доступна только на протяжении работы скрипта и НЕ хранится в хранилище на сервере, а хранится в оперативной памяти (а значит исчезает после очередного выполнения скрипта, инициализируясь вновь из хранилища при очередном обращении к серверу).

    У Котерова:

    При завершении сценария PHP автоматически сохраняет массив $_SESSION во временном хранилище, имя которого хранится в SID

    имеется ввиду, что в хранилище записываются данные из массива $_SESSION, если таковые в нём имеются.

  2. Кука SID.
    Создаётся при старте сессии session_start(). Хранит данные о местоположении хранилища данных о сессии данного пользователя. Удаляется только при принудительной чистке куков.
  3. И наконец, Хранилище данных сессии.
    Создаётся при старте сессии вызовом функции session_start(). Хранилище располагается на сервере (там где работает ваш php скрипт).
    В него записываются данные из массива $_SESSION, если они там есть/появляются. Удаляются данные из него только при вызове session_destroy().
    Данное хранилище продолжает сущелствовать на сервере даже после того, как очередной запрос от пользователя получил ответ, т.е. скрипт завершил свою работу.

Т.е. можно сказать, что:

  • В php-скрипте работать с данными сессии можно через массив $_SESSION
  • $_SESSION является "маской" для хранилища сессии и хотя запись в этот массив приводит к записи в хранилище, удаление массива само по себе не уничтожает данные в хранилище.
  • удалив массив, вы потеряете доступ к данным сессии только в текущем вызове скрипта, но в следующем он будет вновь иницилизирован (восстанет из пепла), если дополнительно не очистить хранилище.

Таким образом

Если session_destroy() не будет вызвана, и не будут очищены куки, то при новом запуске скрипта, данные из хранилища, записанные в него ранее, появятся в $_SESSION, даже если при этом запуске скрипта, вручную в $_SESSION вы их не добавите.

Итак,

// Эту строку пишем, чтобы очистить данные о сессии в текущем запуске скрипта
$_SESSION = [];
//Эта строка удаляет SID
@unset($_COOKIE[session_name()]);
//Удаляет хранилище сессии:
session_destroy();

Источники

vedro-compota's picture

И наконец, Хранилище данных.
Создаётся при старте сессии session_start(). Это файл, который хранится на компьютере пользователя.

Изменено на (что правильно, хранилище находится на сервере, а не на компе пользователя):

И наконец, Хранилище данных сессии.
Создаётся при старте сессии вызовом функции session_start(). Хранилище располагается на сервере (там где работает ваш php скрипт).
В него записываются данные из массива $_SESSION, если они там есть/появляются. Удаляются данные из него только при вызове session_destroy().
Данное хранилище продолжает сущелствовать на сервере даже после того, как очередной запрос от пользователя получил ответ, т.е. скрипт завершил свою работу.

_____________
матфак вгу и остальная классика =)

melisa's picture

спасибо

vedro-compota's picture

отличная статья)

_____________
матфак вгу и остальная классика =)

vedro-compota's picture

О проблеме блокировки сессий при хранении в файлах: http://fkn.ktu10.com/?q=node/10487

_____________
матфак вгу и остальная классика =)