Статьи

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

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

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

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

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

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

Протокол HTTP и запрос без сохранения состояния

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

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

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

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

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

Следующая диаграмма показывает, как протокол HTTP работает с сеансами.

Протокол HTTP и запрос с сессиями

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

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

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

Этот метод вы увидите чаще всего, когда сеанс запускается session_start .

1
2
3
4
5
6
<?php
// start a session
session_start();
 
// manipulate session variables
?>

Важно то, что функция 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
2
3
4
<?php
session_start();
echo session_id();
?>

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

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

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

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
<?php
// start a session
session_start();
 
// initialize session variables
$_SESSION[‘logged_in_user_id’] = ‘1’;
$_SESSION[‘logged_in_user_name’] = ‘Tutsplus’;
 
// access session variables
echo $_SESSION[‘logged_in_user_id’];
echo $_SESSION[‘logged_in_user_name’];
?>

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

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

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<?php
session_start();
 
if (!isset($_SESSION[‘count’]))
{
  $_SESSION[‘count’] = 1;
}
else
{
  ++$_SESSION[‘count’];
}
 
echo $_SESSION[‘count’];
?>

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

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

01
02
03
04
05
06
07
08
09
10
<?php
// start a session
session_start();
 
// initialize a session variable
$_SESSION[‘logged_in_user_id’] = ‘1’;
 
// unset a session variable
unset($_SESSION[‘logged_in_user_id’]);
?>

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

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

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

1
2
3
4
5
6
7
8
9
<?php
// start a session
session_start();
 
// assume that we’ve initialized a couple of session variables in the other script already
 
// destroy everything in this session
session_destroy();
?>

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

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

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

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