Advertisement
  1. Code
  2. Coding Fundamentals

Как использовать сессии и переменные сессий в PHP

Scroll to top
Read Time: 7 min

() translation by (you can also view the original English article)

Обработка сессии это ключевой приём в PHP, что позволяет хранить данные пользователя на всех страницах веб-сайта или приложения. Из этой статьи вы узнаете основы обработки сессии в PHP.

Мы начнем с объяснения того, как работают сессии и как они связаны с куки-файлами. Затем мы рассмотрим несколько фрагментов кода, демонстрирующих, как работать с сеансами. Вы узнаете, как создавать и уничтожать сеансы и как изменять переменные сеанса.

Что такое сессия в PHP?

Сессия — это механизм для сохранения информации на разных веб-страницах для идентификации пользователей пока они бродят по сайту или приложению. Вам интересно, почему сеансы нужны для веб-сайта? Чтобы понять, почему сеансы необходимы, нам нужно чуть вернуться назад и посмотреть, как работает HTTP-протокол.

Протокол HTTP — это протокол без учета состояния, что означает, что сервер не может сопоставить конкретного пользователя по несколькими запросами. Например, при доступе к веб-странице, сервер несёт ответственность за предоставление содержимого запрашиваемой страницы. Поэтому, когда вы обращаетесь к другим страницам одного и того же веб-сайта, веб-сервер интерпретирует каждый запрос отдельно, как если бы они не были связаны друг с другом. Серверу не известно, что каждый запрос исходит от одного и того же пользователя.

Следующая диаграмма вкратце изображает протокол HTTP.

The HTTP Protocol and a Stateless RequestThe HTTP Protocol and a Stateless RequestThe HTTP Protocol and a Stateless Request

В этой модели, если вы хотите отобразить пользовательскую информацию, вам нужно будет аутентифицировать пользователя в каждом запросе. Представьте, что вам нужно было вводить ваше имя пользователя и пароль на каждой странице с информацией ваших о данных! Да, это было бы громоздко и вообще не практично, и именно здесь на помощь приходят сеансы.

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

Обработка входа с сессиями и файлами «куки» (cookie)

Давайте быстро рассмотрим общий пример входа на веб-сайт, чтобы понять, что происходит за кулисами.

  1. Пользователь открывает страницу входа на веб-сайт.
  2. После отправки формы входа, сервер, на другом конце, аутентифицирует запрос, проверив введённые учётные данные.
  3. Если учётные данные, введённые пользователем, верны, сервер создаёт новый сеанс. Сервер генерирует уникальное случайное число, которое называется идентификатором сеанса. Также, на сервере, создаётся новый файл, который используется для хранения информации, относящейся к сеансу.
  4. Затем, идентификатор сеанса передаётся обратно пользователю, вместе с тем, что он запросил. За кулисами этот идентификатор сеанса отправляется в заголовке ответа «куки» PHPSESSID (так называется по умолчанию).
  5. Когда браузер получает ответ от сервера, он получает заголовок куки-файла PHPSESSID. Если в браузере разрешены «куки», то он сохранит этот PHPSESSID, в котором хранится идентификатор сеанса, переданный сервером.
  6. Для последующих запросов, «кука» PHPSESSID передаётся обратно на сервер. Когда сервер получает «куку» PHPSESSID, он пытается инициализировать сеанс с этим идентификатором сеанса.  Он делает это, загружая файл сеанса, который был создан ранее во время инициализации сеанса. Затем он инициализирует суперглобальную переменную массива $_SESSION с данными, хранящимися в файле сеанса.

Таким образом, пользовательские данные сохраняются даже в нескольких запросах, и пользователь не теряется на протяжении всего сеанса.

На следующей диаграмме показано, как протокол HTTP работает с сеансами.

The HTTP Protocol and a Request With SessionsThe HTTP Protocol and a Request With SessionsThe HTTP Protocol and a Request With Sessions

Теперь, когда вы увидели краткое введение в работу сессий, мы создадим несколько практических примеров, чтобы продемонстрировать, как создавать и манипулировать переменными сессии.

Как запустить сессию

В этом разделе мы обсудим, как запустить сессию в PHP.

Всякий раз, когда вы хотите поработать с переменными сеанса, необходимо убедиться, что сеанс уже запущен. Сеанс в PHP можно запустить несколькими способами.

Использование функции session_start

Метод, в котором сессия запускается функцией session_start, вы будете видеть часто.

1
<?php
2
// start a session

3
session_start();
4
5
// manipulate session variables

6
?>

Важно, чтобы функция session_start вызывалась в начале скрипта, перед отправкой чего-либо браузеру. В противном случае, вы столкнётесь с печально известной ошибкой Headers are already sent.

Автоматический запуск сеанса

При необходимости применения сессий в приложении, есть возможность запускать сеанс автоматически без использования функции session_start.

В файле php.ini есть параметр session.auto_start, который позволяет запускать сеанс автоматически для каждого запроса. По умолчанию установлено значение 0 (выкл), и вы можете установить его на 1 (вкл), чтобы включить функцию автоматического запуска.

1
session.auto_start = 1

С другой стороны, если у вас нет доступа к файлу php.ini, и вы используете веб-сервер Apache, эту переменную можно задать с помощью файла .htaccess.

1
php_value session.auto_start 1

Если вы добавите строку выше в ваш .htaccess файл, то это должно автоматически запускать сессии в вашем PHP-приложении.

Как получить идентификатор сеанса

Как мы уже рассмотрели ранее, сервер создаёт уникальный номер для каждой новой сессии. Если вы хотите получить идентификатор сеанса, можно использовать функцию session_id, как показано в следующем фрагменте.

1
<?php
2
session_start();
3
echo session_id();
4
?>

Это должно выдать вам идентификатор текущего сеанса. Функция идентификатора session_id интересна тем, что она ещё может принимать один аргумент — идентификатор сеанса.  Если вы хотите заменить сгенерированный системой идентификатор сеанса на ваш, это можно сделать, передав первый аргумент функции session_id.

1
<?php
2
session_id(YOUR_SESSION_ID);
3
session_start();
4
?>

Важно отметить, что если вы хотите начать сеанс с помощью своего идентификатора сеанса, функция session_id должна стоять перед вызовом session_start.

Создание переменных сеанса

В этом разделе мы изучим, как инициализировать переменные сессии в PHP.

Как мы уже обсудили, при запуске сеанса, инициализируется суперглобальный массив $_SESSION с соответствующей информацией о сессии. По умолчанию, он инициализируется в виде пустого массива, и вы можете хранить больше информации, используя пару ключ–значение.

Давайте рассмотрим следующий пример кода, который показывает, как инициализировать переменные сеанса.

1
<?php
2
// start a session

3
session_start();
4
5
// initialize session variables

6
$_SESSION['logged_in_user_id'] = '1';
7
$_SESSION['logged_in_user_name'] = 'Tutsplus';
8
9
// access session variables

10
echo $_SESSION['logged_in_user_id'];
11
echo $_SESSION['logged_in_user_name'];
12
?>

Как видите, мы запустили сессию в начале скрипта, используя функцию session_start. После этого мы инициализировали несколько переменных сессии. Наконец, мы использовали эти переменные через суперглобальную переменную $_SESSION.

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

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

Как изменять и удалять переменные сеанса

Можно изменять или удалять переменные сеанса, созданные ранее в приложении так же, как обычные переменные PHP.

Давайте посмотрим, как изменять переменные сессии.

1
<?php
2
session_start();
3
4
if (!isset($_SESSION['count']))
5
{
6
  $_SESSION['count'] = 1;
7
}
8
else
9
{
10
  ++$_SESSION['count'];
11
}
12
13
echo $_SESSION['count'];
14
?>

В приведённом выше коде, мы проверяем, установлена ли переменная $_SESSION['count']. Если не установлена, мы устанавливаем её равной 1, в противном случае, увеличим её на 1. Таким образом, если вы обновите эту страницу несколько раз, вы должны увидеть, что счётчик, каждый раз, увеличивается на единицу!

С другой стороны, если вы хотите удалить переменную сеанса, вы можете использовать функцию unset, как показано в следующем фрагменте.

1
<?php
2
// start a session

3
session_start();
4
5
// initialize a session variable

6
$_SESSION['logged_in_user_id'] = '1';
7
8
// unset a session variable

9
unset($_SESSION['logged_in_user_id']);
10
?>

Таким образом, вы больше не сможете обращаться к переменной $_SESSION ['logged_in_user_id'], поскольку она удалена функцией unset. Вот так вы можете изменить информацию о сеансе.

Как уничтожить сессию

В этом разделе мы увидим, как можно уничтожить сессию. В предыдущем разделе мы рассмотрели функцию unset, которая используется для удаления определённых переменных сеанса.  С другой стороны, если вы хотите удалить сразу все данные, связанные с сеансом, вы можете использовать функцию session_destroy.

Попробуем понять, как это работает в следующем примере.

1
<?php
2
// start a session

3
session_start();
4
5
// assume that we’ve initialized a couple of session variables in the other script already

6
7
// destroy everything in this session

8
session_destroy();
9
?>

Функция session_destroy удаляет всё, что хранится в текущем сеансе. Таким образом, с последующими запросами вы увидите пустую переменную $_SESSION, поскольку данные сеанса, хранящиеся на диске, были удалены функцией session_destroy.

Как правило, функцию session_destroy нужно использовать, когда пользователь выходит из системы.

Заключение

В этой статье мы изучили основы обработки сеансов в PHP. Это ключевая концепция, которая позволит вам сохранять информацию для веб-страниц.

В первой половине статьи мы обсудили основные концепции сеансов, а затем мы создали несколько примеров на PHP, чтобы продемонстрировать, как вы могли создавать и уничтожать сеансы, а также манипулировать переменными сеанса.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.