Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
vp-webdev
6 лет назад

Что такое сессии, для чего они нужны и где используются

Введение

Если ваше приложение написано на PHP и в качестве web-сервера вы используете Apache или Nginx - то время жизни каждого запроса к серверу ограничивается миллисекундами. Каждый следующий запрос ничего не знает о предыдущем и живёт абсолютно новой жизнь. Тут возникает вопрос - как связать между собой все запросы к серверу. Ярчайший пример - это авторизация. Если вы авторизовались на сайте и переходите по разным страницам - вам не нужно каждый раз заново вводить логин и пароль. Добиться такого поведения системы как раз помогут сессии. Корзина в интернет-магазине работает схожим принципом, как и многое другое.

Как устроены, и как работают сессии?

Сессия хранится на сервере и она недоступна извне. В браузер же информацию из неё можно передать по идентификатору сессии.
Идентификатору сессии, по умолчанию, хранится в куках и обозначается как PHPSESSID
Чтобы подключить сессии в php-скрипте - достаточно до работы с ними прописать вызов функции:

session_start();

После этого браузер всегда будет обмениваться с сервером идентификатором сессии. Если идентификатора нет - то он будет создан заново. У каждого посетителя свой идентификатор, таким образом не получится получить чью-то чужую сессию.
Однако, в больших и сложных проектах такое иногда случается, но это не проблема сессий, а ошибка реализации. Например, сайт работает на нескольких серверах одновременно, на каждом из них есть своё хранилище сессий. При переходе по страницам сайта посетитель попадает случайным образом на один из серверов сайта. И если сессия пользователя была создана на одном сервере - то на другом сервере она могла быть создана другим посетителем, с тем же идентификатором.
Чтобы избежать такой ситуации - используется механизм липких сессий. В этом случае за пользователем "закрепляется" сервер, на котором была сформирована его сессия и он всегда пользуется им, пока жива сессия.

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

Пример

$string = 'golos.io';
$_SESSION['site'] = $string;
$_SESSION['login'] = 'vp-webdev';

echo $_SESSION['site'];

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

Область применения

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

В завершение стоит напомнить, что нельзя светить идентификатором сессии, тем более в адресной строке браузера. Это небезопасно.

Материал подготовлен автором @tristamoff

0
240.246 GOLOS
На Golos с August 2017
Комментарии (2)
Сортировать по:
Сначала старые