Оглавление
Введение в сессии PHPКак это работаетСоздание новой сессииГде PHP хранит данные сессийДоступ к данным сессииУдаление данных сессииИтог
Сессии в PHP
Введение в сессии PHP
Протокол HTTP является stateless (не сохраняет состояние). Например, когда вы открываете страницу товара product.php, веб-сервер просто возвращает её содержимое.
Если вы нажимаете кнопку "Добавить в корзину" на странице
product.php и переходите на страницу cart.php, сервер не будет знать, что вы добавили товар в корзину.Для сохранения информации между страницами веб-сервер использует сессии. В этом примере, когда вы нажимаете "Добавить в корзину", сервер сохраняет товар на своей стороне. При переходе на
cart.php сервер получает товары из сессии и отображает их на странице.Как это работает
- Веб-браузер запрашивает страницу
product.php. - Веб-сервер возвращает содержимое страницы
product.php. - Вы нажимаете кнопку "Добавить в корзину" на
product.php. Страница отправляет HTTP-запрос (POST или GET) на сервер. - Сервер проверяет товар, генерирует идентификатор сессии и создаёт на сервере новый текстовый файл для хранения информации о выбранном товаре.
- Сервер отвечает браузеру, отправляя в заголовке ответа
cookieс именемPHPSESSID, содержащий идентификатор сессии. Если браузер поддерживаетcookies, он сохраняет этотcookie. - В последующих запросах (например, при открытии
cart.php) браузер отправляет cookiePHPSESSIDобратно серверу. Сервер, получив этотcookie, возобновляет сессию по идентификатору из него. - Сервер возвращает страницу корзины с выбранными товарами.
Сессии позволяют хранить данные на сервере, связанные с определённым идентификатором этой сессии. После создания сессии 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:Как это работает:
- Создаём новую сессию вызовом
session_start(). - Устанавливаем данные сессии: ключ
user- значение'admin', ключroles- массив ролей.
На странице profile.php доступ к данным сессии осуществляется так:
Как это работает:
- Возобновляем существующую сессию, созданную в index.php.
- Обращаемся к данным сессии через массив
$_SESSION.
Удаление данных сессии
При закрытии браузера PHP автоматически удаляет сессию. Иногда требуется явно удалить сессию, например, при нажатии ссылки "Выход". Для этого используется функция
session_destroy():Эта функция удаляет все данные, связанные с текущей сессией, но не очищает массив
$_SESSION и cookie.Для полного удаления данных сессии необходимо:
- Очистить переменные в массиве
$_SESSION. - Удалить
cookieс идентификатором сессии.
Пример:
Обратите внимание: используется функция
session_name() для получения имени cookie вместо жёстко заданного PHPSESSID. Это позволяет работать с несколькими сессиями с разными именами в одном скрипте.Итог
- Сессии позволяют сохранять данные между страницами веб-приложения.
- Для создания или возобновления сессии вызывайте session_start() до любого вывода в браузер.
- Для доступа к данным используйте суперглобальный массив
$_SESSION. - Для полного удаления данных сессии используйте
session_destroy(), предварительно очистив массив и удалив cookie.

