Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Сессия

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

Сессии реализуются на уровне конкретных фреймворков и только в 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 очень много тонкостей и механизмов для управления ими. Если вам интересно разобраться глубоко в том как устроена её работа, добро пожаловать в официальную документацию.

Самостоятельная работа

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

Дополнительные материалы

  1. Официальная документация

<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят менторы из команды Хекслета или другие студенты.

Для полного доступа к курсу нужна профессиональная подписка

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

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

Зарегистрироваться

или войти в аккаунт

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».