Сессии в PHP

Сегодня меня спросили, что такое сессии и как они работают по умолчанию в php. Что такое сессии и зачем они нужны мне вполне известно. Но как они хранятся по дефолту я подзабыл. т.к. уже давно знаю, что лучшим решением для хранения сессий будет использование внешнего быстро действующего хранилища, например, redis. Итак, вспомним и разберемся по порядку что к чему.

Что такое сессия в PHP?

Сессии являются простым способом хранения информации для отдельных пользователей с уникальным идентификатором сессии. Этот механизм может использоваться для сохранения состояния между запросами страниц.

Зачем нужны сессии?

Пояснение с картинками. Следующая диаграмма вкратце изображает протокол HTTP.

The HTTP Protocol and a Stateless Request

При таком взаимодействии необходимо проводить процедуру идентификации пользователя при каждом запросе, если мы хотим показать контент доступный только для конкретного юзера.
Что бы не производить эту трудо-затратную процедуру при каждом запросе, можно использовать сессии.

Механика. Работа сессий и кук

Как работает механизм сессий в деталях:

  1. Пользователь открывает страницу входа на веб-сайт.
  2. После отправки формы входа, сервер, на другом конце, аутентифицирует запрос, проверив введённые учётные данные.
  3. Если учётные данные, введённые пользователем, верны, сервер создаёт новый сеанс. Сервер генерирует уникальное случайное число, которое называется идентификатором сеанса. Также, на сервере, создаётся новый файл, который используется для хранения информации, относящейся к сеансу.
  4. Затем, идентификатор сеанса передаётся обратно пользователю, вместе с тем, что он запросил. За кулисами этот идентификатор сеанса отправляется в заголовке ответа «куки» PHPSESSID (SID).
  5. Когда браузер получает ответ от сервера, он получает заголовок куки-файла PHPSESSID. Если в браузере разрешены «куки», то он сохранит этот PHPSESSID, в котором хранится идентификатор сеанса, переданный сервером.
  6. Для последующих запросов, «кука» PHPSESSID передаётся обратно на сервер. Когда сервер получает «куку» PHPSESSID, он пытается инициализировать сеанс с этим идентификатором сеанса.  Он делает это, загружая файл сеанса, который был создан ранее во время инициализации сеанса. Затем он инициализирует суперглобальную переменную массива $_SESSION с данными, хранящимися в файле сеанса.

The HTTP Protocol and a Request With Sessions
По умолчанию PHP использует внутренний обработчик files для сохранения сессий, который установлен в INI-переменной session.save_handler. Этот обработчик сохраняет данные на сервере в директории, указанной в конфигурационной директиве session.save_path.

Внимание

НЕ ОЧИЩАЙТЕ $_SESSION целиком, используя unset($_SESSION), так как это отключит возможность регистрации сессионных переменных через суперглобальную переменную $_SESSION.

Вы не можете использовать ссылки в сессионных переменных, так как не существует реального способа восстановления ссылки к другой переменной.

Замечание:
Сессии, использующие файлы (по умолчанию в PHP), блокируют файл сессии сразу при открытии сессии функцией session_start() или косвенно при указании session.auto_start. После блокировки, ни один другой скрипт не может получить доступ к этому же файлу сессии, пока он не будет закрыт или при завершении скрипта или при вызове функции session_write_close().

Скорее всего это станет проблемой для сайтов, которые активно используют AJAX и делают несколько одновременных запросов. Простейшим путём решить эту проблему будет вызов функции session_write_close() сразу же как только все требуемые изменения в сессии будут сделаны, предпочтительно ближе к началу работы скрипта. Также можно использовать другой механизм сессии, который поддерживает конкурентный доступ.

Итог

Сессии достаточно простой и удобный механизм, позволяющий сохранить идентификационные данные клиента на сервере, а ключ(идентификатор) сохраняется на стороне клиента.
Недостатком сессий в базовом виде является то, что они хранятся в файлах. Это замедляет их работу и может вызывать блокировки.
Поэтому более быстрым и безопасным вариантом будет хранить их в отдельном хранилище. Сделать это можно с помощью функции

session_set_save_handler()

Она устанавливает пользовательские обработчики хранения сессии, которые используются для сохранения и получения данных, связанных с сессией.
Так же важно помнить о безопасности, если сессии используются для предоставления любых конфиденциальных данных.

Нужно использовать дополнительные методы обеспечения защиты данных, т.к. механика сессий предоставляемая языком php по умолчанию не гарантирует защищенность данных, о чем и написано в документации.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *