Работа с сессиями PHP
Сессии позволяют установить связь между посетителем и сайтом при помощи идентификатора сессии.
Переменные сессии и их значения хранятся только на сервере. На компьютере пользователя и на сервере хранится лишь идентификатор сессии (сгенерированный случайным образом), который позволяет нам установить связь между пользователем и сервером.
Идентификатор сессии, хранящийся на компьютере пользователя, это файл cookie
.
Cookie
хранится в браузере пользователя, при этом соответствующий файл создается и на сервере.
Создаем сессию
Самый простой способ открытия сессии заключается в использовании функции session_start
:
PHP
// инициировать сессию
session_start();
Эта функция проверяет, существует ли идентификатор сессии, и, если нет, то создает его. Если идентификатор текущей сессии уже существует, то загружаются зарегистрированные переменные сессии.
Данная конструкция (для каждой страницы нужно вызвать один раз) должна быть вызвана до любого вывода (это правило работает и для setcookie()
), включая пробелы.
Когда создается сессия в браузер ‛прилетает“ кука следующего вида:
PHP
echo "Имя сессии: ".session_name(). " Идентификатор сессии: ".session_id();
// Имя сессии: PHPSESSID Идентификатор сессии: mceu820l02id3ds0vcvtgnht04
Создаем переменную сессии
Переменная сессии создается путем добавлением какого-либо значения суперглобальному массиву $_SESSION
:
PHP
$_SESSION['nick'] = $_POST['name'];
Уничтожаем переменные сессии и саму сессию
1. Удалить переменную сессии можно следующим образом:
PHP
unset($_SESSION['nick']);
Этим мы предотвратим повторное использование информации.
Но лучше просто очистить массив $_SESSION
(удалить все переменные сессии):
PHP
//очистить массив $_SESSION
$_SESSION = array();
2. Также необходимо сделать следующее:
Установить файл cookie сессии недействительным:
PHP
if (isset($_COOKIE[session_name()])) { // session_name() - получаем название текущей сессии
setcookie(session_name(), '', time()-86400, '/');
}
Имя сессии ссылается на session id в куках и URL
3. Уничтожить (завершить) сессиию
PHP
session_destroy();
Буферизация вывода
Если у вас уже есть какой-либо вывод, вы можете воспользоваться фукцией ob_start()
. Данная функция делает буферизацию вывода. Теперь вывод не будет отправлен браузеру, пока вы не отправите его принудительно при помощи функции ob_end_flush()
.
PHP + HTML
<?php
session_start();
ob_start();
?>
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<?php
if (isset($_SESSION['nick'])) {
echo 'Hi, ' . $_SESSION['name'] . '<br>';
unset($_SESSION['nick']);
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-86400, '/'); // содержимое сессии - пустая строка
}
// setcookie сработает безошибочно, так как мы только сейчас
ob_end_flush(); // отправили браузеру вывод
session_destroy();
С другой стороны, не всегда необходимо использовать функцию ob_end_flush()
, так как интерпретатор PHP автоматически очистит буфер по выполнению сценария.
Пересоздаем идентификатор сессии
При каждом входе в систему необходимо, в целях безопасности, пересоздавать идентификатор сессии. Информация в переменных сессии сохраняется, меняется лишь идентификатор сессии. Не забывайте, информация о сессии хранится на веб-сервере в виде текста в соответствующем файле. Чтобы пересоздать идентификатор вызовите session_regenerate_id()
и обновите текущую страницу или перенаправьте пользователя на другую страницу.
Механизм работы сессий
Уменьшаем время жизни сессии
По умолчанию время жизни сессии равно 0, то есть, когда пользователь закрывает окно браузера, сессия уничтожается. Иногда требуется прикончить сессию пользователя по причине отсутствия активности с его стороны. Реализовать подобное можно следующим образом (рассмотрим на примере авторизации): мы создаем переменную и сохраняем в ней время авторизации пользователя, в случае попытки обновить страницу мы сравним время с временем бездействия и в случае превышения разлогиниваем пользователя, при этом перекидываем пользователя на страницу авторизации.
PHP
$_SESSION['start'] = time(); // временная метка авторизации пользователя
$now = time(); // текущее время
$time_limit = 1000; // максимально допустимое время бездействия пользователя в сек.
if ($now > $_SESSION['start'] + $time_limit )
{
echo "Ваше время истекло";
//.......
// и удаляем сессию и ее cookie
}
else { $_SESSION['start'] = time(); } // если порядок, обновляем
Как сделать время жизни сессии вечной ?
Для того чтобы клиент оставался всегда залогиненным, не надо делать время жизни сессии вечной. Сессия - на то она и сессия, чтобы начаться, когда клиент пришел, и завершиться, когда клиент ушел.
Когда клиент пришел вновь - надо начать новую сессию, но загрузить в неё данные о клиенте, основываясь на уникальной для клиента куке, которая надолго устанавливается ему при выборе галочки, например, "запомнить меня".
Работа с сессией при отключенных куках
Если для настройки session.use_trans_sid
установить 1
, то при отключенных куках PHP будет передавать PHPSESSID методом GET в строке запроса.
Комментарии к статье
<b>спасибо</b>
Спасибо
Спасибо, полезная информация.
Спасибо! Перерыл весь интернет по поводу удаления сессии (выход), ничего не помогало! Единственно верное разжеванная статья! Спасибо огромное!!! Все работает!
Спасибо :*
нормально так !
Спасиб
Спасибо! Статья очень помогла!
Все сделал так же: открыл сессию, назначил переменную через пост, но как только назначаю вторую переменную (так же через пост) первая слетает. Почему такое может быть?
245254
245254