Введение в сессии PHP

Протокол HTTP является stateless (не сохраняет состояние). Например, когда вы открываете страницу товара product.php, веб-сервер просто возвращает её содержимое.
Если вы нажимаете кнопку "Добавить в корзину" на странице product.php и переходите на страницу cart.php, сервер не будет знать, что вы добавили товар в корзину.
Для сохранения информации между страницами веб-сервер использует сессии. В этом примере, когда вы нажимаете "Добавить в корзину", сервер сохраняет товар на своей стороне. При переходе на cart.php сервер получает товары из сессии и отображает их на странице.

Как это работает

  1. Веб-браузер запрашивает страницу product.php.
  2. Веб-сервер возвращает содержимое страницы product.php.
  3. Вы нажимаете кнопку "Добавить в корзину" на product.php. Страница отправляет HTTP-запрос (POST или GET) на сервер.
  4. Сервер проверяет товар, генерирует идентификатор сессии и создаёт на сервере новый текстовый файл для хранения информации о выбранном товаре.
  5. Сервер отвечает браузеру, отправляя в заголовке ответа cookie с именем PHPSESSID, содержащий идентификатор сессии. Если браузер поддерживает cookies, он сохраняет этот cookie.
  6. В последующих запросах (например, при открытии cart.php) браузер отправляет cookie PHPSESSID обратно серверу. Сервер, получив этот cookie, возобновляет сессию по идентификатору из него.
  7. Сервер возвращает страницу корзины с выбранными товарами.
Сессии позволяют хранить данные на сервере, связанные с определённым идентификатором этой сессии. После создания сессии PHP отправляет cookie с идентификатором сессии браузеру. В дальнейшем браузер возвращает этот cookie серверу, чтобы PHP мог получить данные по идентификатору.

Создание новой сессии

Для создания новой сессии используется функция session_start():
При первом вызове session_start() PHP генерирует уникальный идентификатор сессии и передаёт его браузеру в виде cookie с именем PHPSESSID.
Если сессия уже существует, PHP проверяет cookie PHPSESSID, отправленный браузером, и возобновляет существующую сессию вместо создания новой.
Так как PHP отправляет cookie PHPSESSID в заголовке HTTP-ответа, функцию session_start() необходимо вызывать до любого вывода в браузер. В противном случае вы получите предупреждение о невозможности изменения заголовков - это известная ошибка в PHP.

Где PHP хранит данные сессий

По умолчанию PHP хранит данные сессий во временных файлах на сервере. Путь к этим файлам можно узнать с помощью директивы session.save_path в конфигурационном файле PHP.
Пример получения пути:
Обычно данные сессий хранятся в папке /tmp сервера, например, /xampp/tmp.

Доступ к данным сессии

В отличие от cookies, в сессии можно хранить любые данные. Для этого используются ключ и значение в суперглобальном массиве $_SESSION.
Пример хранения данных в index.php:
Как это работает:
  1. Создаём новую сессию вызовом session_start().
  2. Устанавливаем данные сессии: ключ user - значение 'admin', ключ roles - массив ролей.
На странице profile.php доступ к данным сессии осуществляется так:
Как это работает:
  1. Возобновляем существующую сессию, созданную в index.php.
  2. Обращаемся к данным сессии через массив $_SESSION.

Удаление данных сессии

При закрытии браузера PHP автоматически удаляет сессию. Иногда требуется явно удалить сессию, например, при нажатии ссылки "Выход". Для этого используется функция session_destroy():
Эта функция удаляет все данные, связанные с текущей сессией, но не очищает массив $_SESSION и cookie.
Для полного удаления данных сессии необходимо:
  1. Очистить переменные в массиве $_SESSION.
  2. Удалить cookie с идентификатором сессии.
Пример:
Обратите внимание: используется функция session_name() для получения имени cookie вместо жёстко заданного PHPSESSID. Это позволяет работать с несколькими сессиями с разными именами в одном скрипте.

Итог

  • Сессии позволяют сохранять данные между страницами веб-приложения.
  • Для создания или возобновления сессии вызывайте session_start() до любого вывода в браузер.
  • Для доступа к данным используйте суперглобальный массив $_SESSION.
  • Для полного удаления данных сессии используйте session_destroy(), предварительно очистив массив и удалив cookie.