От автора: обработка сессии PHP является ключевой концепцией языка, которая позволяет сохранять информацию пользователя на всех страницах веб-сайта или приложения. В этом посте вы узнаете основы обработки сессий в PHP.
Мы начнем с пояснения того, как работают сессии и как они связаны с файлами куки. Затем мы рассмотрим несколько фрагментов кода, демонстрирующих, как работать с сессиями. Вы узнаете, как создавать и удалять сессии и как изменять переменные сессии.
Что такое сессия в PHP?
Сессия — это механизм для сохранения информации на разных веб-страницах для идентификации пользователей при навигации по сайту или приложению. Вам интересно, почему сессии необходимы для веб-сайта? Чтобы понять, для чего необходимы сессии, нам нужно рассмотреть, как работает протокол HTTP.
Протокол HTTP — это протокол без учета состояния, что означает, что сервер не может запоминать конкретного пользователя между несколькими запросами. Например, при доступе к веб-странице сервер отвечает за предоставление содержимого запрашиваемой страницы. Поэтому, когда вы обращаетесь к другим страницам одного и того же веб-сайта, веб-сервер интерпретирует каждый запрос отдельно, как если бы они не были связаны друг с другом. Серверу не известно, что каждый запрос исходит от одного и того же пользователя. Следующая диаграмма иллюстрирует протокол HTTP.
В этой модели, если вы хотите отображать информацию пользователя, вам нужно будет аутентифицировать пользователя в каждом запросе. Представьте, что вам нужно было бы вводить имя пользователя и пароль на каждой странице, на которой была представлена ваша информация о профиле! Да, это было бы вообще не практичным, и именно здесь на сцену выходят сессии.
Сессия позволяет обмениваться информацией на разных страницах одного сайта или приложения, что помогает поддерживать состояние. Это позволяет серверу знать, что все запросы исходят от одного и того же пользователя, что дает возможность отображать информацию и настройки пользователя.
Поток авторизации с помощью сессий и файлов куки
Давайте кратко рассмотрим общий поток авторизации, чтобы понять, что происходит за кулисами.
Пользователь открывает страницу авторизации на сайте.
После отправки данных формы входа сервер на другом конце аутентифицирует запрос, проверив введенные учетные данные.
Если учетные данные, введенные пользователем, действительны, сервер создает новую сессию. Сервер генерирует уникальное случайное число, которое называется идентификатором сессии. Он также создает новый файл, который используется для хранения информации, относящейся к сессии.
Затем пользователю передается идентификатор сессии, а также любой запрошенный ресурс. За кулисами этот идентификатор сеанса отправляется в файле куки PHPSESSID в заголовке ответа.
Когда браузер получает ответ от сервера, он находит его в заголовке файла куки PHPSESSID. Если куки разрешены браузером, он сохранит этот файл PHPSESSID, в котором хранится идентификатор сессии, переданный сервером.
Для последующих запросов куки PHPSESSID возвращается на сервер. Когда сервер получает файл куки PHPSESSID, он попытается инициализировать сессию с этим идентификатором сессии. Он делает это, загружая файл сессии, который был создан ранее во время инициализации сессии. Затем он инициализирует переменную суперглобального массива $_SESSION с данными, хранящимися в файле сессии.
Таким образом, пользовательские данные сохраняются для нескольких запросов, и пользователь остается авторизованным на протяжении всей сессии. На следующей диаграмме показано, как протокол HTTP работает с сессиями.
Теперь, когда мы кратко рассмотрели сессии, мы возьмем несколько практических примеров, чтобы продемонстрировать, как создавать и изменять переменные сессии.
Как начать сессию
В этом разделе мы рассмотрим, как в PHP начать сессию. Каждый раз, когда вы хотите работать с переменными сессии, вам необходимо убедиться, что сессия уже запущена. Есть несколько способов начать сессию в PHP.
Использовать функцию session_start
Это метод, который вы встретите чаще всего, когда сессия запускается функцией session_start.
1 2 3 4 5 6 |
<?php // начало сессии session_start(); // работа с переменными сессии ?> |
Важно то, что функция 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 с помощью соответствующей информации о сессии. По умолчанию он инициализируется пустым, и вы можете хранить дополнительную информацию с помощью пары ключ-значение. Давайте рассмотрим следующий пример скрипта, который демонстрирует, как инициализировать переменные сеанса.
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php // начинаем сессию session_start(); // инициализируем переменные сессии $_SESSION['logged_in_user_id'] = '1'; $_SESSION['logged_in_user_name'] = 'Tutsplus'; // получаем доступ к переменным сессии echo $_SESSION['logged_in_user_id']; echo $_SESSION['logged_in_user_name']; ?> |
Как вы можете видеть, мы начали сессию в начале скрипта, используя функцию session_start. После этого мы инициализировали пару переменных сессии. Наконец, мы получили доступ к этим переменным, используя суперглобальный массив $_SESSION.
Когда вы сохраняете данные в сессии, используя суперглобальный массив $_SESSION, он, в конце концов, сохраняется в соответствующем файле сессии на сервере, который был создан при запуске сессии. Таким образом, данные сессии распределяются между несколькими запросами.
Как было сказано, информация о сессии разделяется между запросами, и, следовательно, переменные сессии, инициализированные на одной странице, могут быть доступны и с других страниц, пока сессия не завершится. Как правило, сессия завершается, когда закрывается браузер.
Как изменить и удалить переменные сессии
Вы можете изменять или удалять переменные сессии, созданные ранее в приложении, так же, как и обычные переменные PHP. Вот как изменить переменные сессии.
1 2 3 4 5 6 7 8 9 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, как показано в следующем сниппете.
1 2 3 4 5 6 7 8 9 10 |
<?php // начинаем сессию session_start(); // инициализируем переменные сессии $_SESSION['logged_in_user_id'] = '1'; // удаляем переменные сессии 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 // начинаем сессию session_start(); // предполагается, что мы уже инициализировали несколько переменных сессии // удаляем все в этой сессии session_destroy(); ?> |
Функция session_destroy удаляет все, что хранится в текущей сессии. Таким образом, вы увидите пустую переменную $_SESSION, поскольку данные сессии, хранящиеся на диске, были удалены. Как правило, функцию session_destroy нужно использовать, когда пользователь выходит из системы.
Заключение
В этой статье мы рассмотрели основы обработки сессий в PHP. Это ключевая концепция, которая позволяет сохранять информацию для различных веб-страниц.
В первой половине статьи мы обсудили основные концепции сессий, а затем мы создали несколько примеров PHP, чтобы продемонстрировать, как вы можете создавать и удалять сессии, а также работать с переменными сессии.
Автор: Sajal Soni
Источник: //code.tutsplus.com/
Редакция: Команда webformyself.