Сессии на php
0

Использование сессий - Работа с сессиями PHP

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

 

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

Идентификатор сессии, хранящийся на стороне клиента (на его компьютере) - это файл cookie. Куки хранятся в браузере пользователя, но при этом файл соответствующий создается также и на сервере.

Давайте перейдем непосредственно к практике.

 

Создаем сессию:

Самый элементарный способ здесь, применить функцию session_start:

1
2
// Запустить сессию
session_start();

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

Такая конструкция должна быть вызвана только один раз для каждой страницы и до любого вывода (данное правило также подходит и для setcookie()).

Приведу пример, когда сессия создается в браузере, то кука там имеет следующий вид

Когда создается сессия в браузер ‛прилетает“ кука следующего вида:

1
2
echo "Название сессии: ".session_name(). " Идентификатор сессии: ".session_id();
// Название сессии: PHPSESSID Идентификатор сессии: mceu371l97id3sa0vcbjqnht06

Тут в целом всё достаточно просто. Идем дальше...

 

Создадим переменную сессии:

Переменную сессии можно создать добавив какое-то значение суперглобальному элементу массива $_SESSION:

1
$_SESSION['login'] = $_POST['name'];

 

Уничтожим переменные сессии и саму сессию:

1. Удалить переменную сессии можно следующим образом (это поможет предотвратить повторное её использование):

1
unset($_SESSION['login']);

Способ выше хорош, но можно очистить весь массив $_SESSION, тем самым мы удалим все переменные из сессии:

1
2
// Чистим наш массив $_SESSION
$_SESSION = array();

2. Теперь нам необходимо сделать файл куки недействительным (где имя сессии ссылается при обращении на session id в куках и URL):

1
2
3
if (isset($_COOKIE[session_name()])) {  // session_name() - вытаскиваем название текущей сессии
setcookie(session_name(), '', time()-86400, '/');
}

3. Ну и следом уничтожим сессию (закроем её):

1
session_destroy();

 

Буферизация вывода:

Если к примеру у вас есть уже какой-то способ вывода, то вы можете использовать функцию ob_start() - она делает как раз таки буферизацию этого вывода. При ее использовании вывод не будет отправлен в браузер, как минимум до тех пор, пока вы не сделаете это принудительно, воспользовавшись функцией ob_end_flush()

1
2
session_start();
ob_start();

Вот более подробный пример кода с использованием ранее рассмотренных кодов и функций:

1
2
3
4
5
6
7
8
9
if (isset($_SESSION['login'])) {
echo 'Привет, ' . $_SESSION['name'] . '
';
unset($_SESSION['login']);
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-86400, '/'); // содержимым нашей сессии является пустая строка
}
ob_end_flush();   // Отправляем браузеру вывод
session_destroy();

Однако стоит обратить внимание, что использование функции ob_end_flush() не всегда является обязательным. А всё потому что интерпретатор PHP автоматически чистит ваш буфер при выполнении какого-то сценария.

 

Пересоздадим идентификатор сессии:

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

 

Принцип работы сессий:

На скриншоте ниже вы можете узреть небольшой обзор самого механизма сессий.

Как работают сессии

 

Уменьшим время жизни сессии:

Стандартное значение времени жизни сессии равно 0, а именно, если пользователь закроет окно браузера, то сессия закроется тоже. Но возникает иногда необходимость уничтожить сессию клиента принудительно по истечению какого-то времени, например из-за не активности с его стороны на сайте. Разберем способ подобной реализации на примере aвторизации пользователя: мы создадим какую-то переменную и сохраним в ней время используемое при авторизации пользователя, к примеру если пользователь попытается обносить страницу, то мы сравниваем время с тем временем, которое он был неактивен, и в случае превышения данного лимита он будет разлогинен и отправлен на страницу авторизации.

1
2
3
4
5
6
7
8
$_SESSION['start'] = time();      // Начало времени, когда пользователь авторизовался
$timezon= time();      // Данное время (то которое есть сейчас)
$time_limit = 2000;    // Это максимальное время не активности пользователя
if ($timezon> $_SESSION['start'] +  $time_limit  ) 
{
echo "Время закончилось"; 
} 
else {$_SESSION['start'] = time();}     // если всё хорошо, то обновляем

Иногда возникает у людей вопрос "Как реализовать бесконечное время жизни сессии?", тут ответ я дам вам такой. Этого не стоит делать, это в корне идеи уже есть не правильно. Сессия на то и дана, чтобы пользователь зашел на сайта - она открылась, он ушел - она закрылась (уничтожилась). Когда он опять зашел сессия открылась новая. Однако можно использовать для сессии данные из куки, которые могут храниться достаточно долго, к примеру при использовании галочки "Запомнить меня" (Помните ведь такую на сайтах?)...

 

Используем сессии при отключенном cookie:

Скажите такого не бывает? Увы и такое иногда встречается. Например если для настройки session.use_trans_sid мы установим значение 1, то при отсутствии использования cookie, PHP будет передавать параметры PHPSESSID с использованием GET метода в вашей строке запроса. 

 

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

Запись опубликована В категории: Изучение PHP

Shnapik

Вебмастер с опытом ищет приют! Возьмите меня, а то меня рвут!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *