Marlin онлайн-платформа

Основы работы с Сессией и Куки

Сессии и куки - зачем же они нужны? Как говорилось в видео, они нужны для того, чтобы при определённых обстоятельствах сайт нас "запомнил", по-другому это называется хранением состояния. Хранить состояние необходимо, чтобы пользователю, авторизовавшись на сайте или выбрав какие-либо опции, например, задав тему оформления страниц, не приходилось на каждой новой странице сайта заново вводить свой логин и пароль или задавать настройки.
Грубо говоря, можно считать, что куки или сессии - это некий контейнер для долгосрочного хранения информации о конкретном пользователе нашего сайта. Все данные, которые сохраняются в куках или сессиях, будут доступны на любой странице нашего сайта в массивах $_COOKIES и $_SESSION.

Хоть сессии и куки рассматриваются в этом уроке вместе, в их работе есть существенные различия:

  1. куки хранятся в браузере, следовательно, к ним есть доступ у пользователя; к сессиям же доступ есть только у сервера, что обеспечивает большую безопасность при работе с секретными данными
  2. и у куки, и у сессии есть время жизни, они не могут быть вечными. Максимальный срок жизни куки - до 20 лет. Они живут до тех пор, пока не истечёт срок их хранения, установленный при создании; сессия же хранится либо до закрытия браузера, либо до окончания сеанса пользователя, длительность которого по умолчанию - 24 минуты.
  3. куки могут хранить только текстовую информацию, а вот сессии одним этим типом данных не ограничены.

Итак, из всего вышесказанного можно сделать вывод: куки подходят для записи информации, которую мы хотим сохранить надолго, а сессии - для не долгосрочных данных, которые требуются для взаимодействия пользователя с сайтом в текущем сеансе. Самое часто встречающееся применение сессий - авторизация на сайте.
Конечно же различий между сессиями и куками больше, и рассказывать о том, как они работают, можно очень долго, однако сейчас наша задача - усвоить суть и основы работы с этими понятиями.

Выше упоминалось, что сессия живёт всего 24 минуты, однако с помощью средств PHP мы можем установить своё время:

ini_set('session.cookie_lifetime', 86400);  //с помощью этих двух строк и встроенной в PHP функции ini_set()
ini_set('session.gc_maxfiletime', 86400);   //мы устанавливаем время жизни сессии на 24 часа


Удалить данные пользователя из сессии можно с помощью функции unset(), которая удаляет переданную ей переменную:

unset($_SESSION['key']);  //в данном примере unset() удалит указанный ключ из массива и его значение


Рассмотрим также пример работы с куками - для установки куки и времени её жизни используется функция setcookie():

setcookie("test_cookie", 'информация для сохранения', time() + 3600);  //с помощью time() мы узнаём текущее календарное время в секундах, а затем так же в секундах к этому времени прибавляем ещё 1 час. 

ПОЯСНЕНИЯ И ПОЛЕЗНАЯ ИНФОРМАЦИЯ

  • Несмотря на то, что сессии и куки рассматриваются в этом уроке вместе и работают похожим образом, всё же между ними есть различия:
    • Файлы куки хранятся в браузере, а это значит - у пользователя есть к ним доступ. К содержимому сессии же доступ есть только у сервера, что обеспечивает наибольшую безопасность.
    • Куки могут хранить только текстовую информацию, а вот сессии одним этим типом данных не ограничены.
    • Конечно же, объём. Максимально допустимый объём файла куки - всего 4 килобайта, да и на количество самих файлов тоже существует ограничение.
    • Может показаться, что сессии во всём круче и кукисы использовать нет смысла, однако именно время жизни последних перекрывает все их недостатки. Они могут жить очень долго - вплоть до десятков лет, в то время как сессия закончит своё существование после закрытия браузера.

 

  • Не стоит пугаться слова "сессия". Какие бы сложные процессы ни происходили у неё под капотом, работаем мы с ней практически так же, как и с обычным ассоциативным массивом.

 

  • Соответственно, очистить сессию можно, удалив её ключи при помощи функции unset(), либо просто присвоив ей пустой массив:
$_SESSION['message'] = 'Hello!';
unset($_SESSION['message']);

// либо:
$_SESSION = []; 

 

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

 

  • А вот куки удалить так просто не выйдет. Единственный способ от них избавиться - это установить повторно с тем же именем, но временем из прошлого:
setcookie('test_cookie', 'some text', time() + 3600);  // ставим куки
setcookie('test_cookie', '', time() - 3600); // удаляем её

 

  • Кстати, если вы при создании куки не укажете время её жизни, она проживёт до ближайшего закрытия браузера, почти как сессия.

 

Задание

Решите задачи:

  1. Сделайте счетчик обновления страницы пользователем. Данные храните в сессии. Скрипт должен выводить на экран количество обновлений. При первом заходе на страницу он должен вывести сообщение о том, что пользователь не обновлял страницу.
  2. Сделайте две страницы: index.php и form.php. При посещении index.php спросите с помощью формы город и возраст пользователя. На form.php сделайте форму с полями 'Имя''Возраст''Город'. Сделайте так, чтобы когда пользователь зайдёт на form.php, поля 'Возраст' и 'Город' уже были заполнены.
  3. Добавьте в предыдущую задачу страницу logout.php. При переходе на нее очищайте и разрушайте сессию пользователя.
  4. При помощи куки и функций работы с датой и временем сделайте следующее: спросите дату рождения пользователя, а при следующем заходе на сайт напишите сколько дней осталось до его дня рождения. Если сегодня день рождения пользователя - поздравьте его!
  5. Напишите свою оболочку над куки. Оболочка должна представлять собой набор пользовательских функций: сохранение куки, удаление куки, редактирование куки.
  6. Реализуйте счетчик посещения сайта посетителем. Каждый раз, заходя на сайт, он должен видеть надпись: 'Вы посетили наш сайт % раз!'.

Дополнительная секция

Вопрос-ответ Обсуждение