Сессия — это абстракция, созданная для удобной работы с индивидуальными пользователями. Она используется для идентификации пользователей и позволяет отличать их друг от друга. Например, аутентификация на сайтах построена поверх механизма сессии.
Сессии реализуются на уровне конкретных фреймворков и только в PHP сессии встроены в язык. Общий принцип работы сессии сводится к трем операциям:
- Старт сессии. Так мы говорим системе, что хотим начать следить за пользователем. Во многих фреймворках эта операция выполняется неявно при попытке чтения или записи в сессию
- Запись данных в сессию
- Чтение данных из сессии
Set-Cookie: _hexlet_session=CM5DvfXch6M3uPJHyfLDpv52wBe4iu3og domain=.hexlet.io; path=/; expires=Sun, 12 Aug 2018 12:56:51 -0000; secure; HttpOnly
Старт сессии на техническом уровне означает установку специальной куки в браузер. Обычно эта кука содержит идентификатор сессии, который уникален для каждого пользователя.
Данные сессии могут храниться где угодно. Это зависит от конкретной реализации. В этом одно из ключевых отличий работы с пользователями напрямую через куки или через сессию.
Сессия — более высокоуровневая абстракция. Например, в PHP по умолчанию данные сессии хранятся в файлах. Из этого следует сразу два вывода:
- Сессия ограничена только физическим пространством дисков
- Данные хранятся на сервере, что безопаснее
Если этого недостаточно, например, серверов больше чем один, то буквально парой строк кода в конфигурации можно изменить тип хранилища с файлов на базу данных.
Также при работе с сессией не надо думать про имена кук, про сериализацию и десериализацию составных данных. Это происходит автоматически.
<?php
// Операция идемпотентна. Не важно, была ли инициализирована сессия раньше, старт сессии выполняется всегда
session_start();
if (!isset($_SESSION['count'])) {
$_SESSION['count'] = 0;
} else {
$_SESSION['count']++;
}
print_r($_SESSION['count']);
Этот простой скрипт демонстрирует работу сессий в PHP. В отличие от остальных суперглобальных массивов для работы с HTTP массив $_SESSION
— изменяемый. Всё, что добавится в него, автоматически попадает в сессию и сохраняется между запросами до тех пор, пока кука не удалится или не изменится.
Из примера выше видно, что сессия упрощает работу с пользователем. Также значением массива $_SESSION
может быть любая составная структура, массив или объект. Механизм сессий автоматически беспокоится о сериализации и десереализации.
Внутри Slim нет особенного механизма для работы с сессиями, так как они не являются частью стандарта PSR-7. Работа с сессией происходит напрямую.
Перепишем наш пример добавления товаров в корзину, используя сессию:
<?php
session_start();
$app->post('/cart-items', function ($request, $response) {
// Информация о добавляемом товаре
$item = $request->getParsedBodyParam('item');
// Добавление нового товара
$_SESSION['cart'][] = $item;
return $response->withRedirect('/');
});
По сравнению с версией на куках ушла значительная часть кода. Кодирование и декодирование в JSON, извлечение куки и перезапись куки.
Иногда возникает задача уничтожать сессию, например, при выполнении выхода из системы. Полное уничтожение сессии включает в себя три шага:
- Обновление куки с установкой даты в прошлое
- Обнуление массива
$_SESSION
—$_SESSION = []
- Обнуление хранилища сессий —
session_destroy()
Только в этом случае сессия уничтожится полностью. Первый шаг можно не делать, но второй и третий — желательно.
У сессий в PHP много тонкостей и механизмов для управления ими. Если интересно разобраться в том, как устроена ее работа, рекомендуем читать официальную документацию.
Самостоятельная работа
Реализуйте аутентификацию. Она состоит из формы входа (достаточно знать емейл) и кнопки выхода, которая появляется после аутентификации
+ image::assets/login-form.png[Форма входа на сайт]
+ image::assets/logout-button.png[Кнопка выхода]
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.