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

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

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

В сессиях используется стандартный, широко известный способ передачи информации. Собственно других то и не существует. Идентификатор – это просто переменная. По умолчанию она принимает значение – PHPSESSID. Задачей PHP является передача ее браузеру, чтобы он прислал в ответ следующий запрос. В FAQ писалось, что переменная передается только двумя способами: через кукисы или через POST/GET-запрос.

В PHP используются оба варианта. Имеется 2 настройки, отвечающие за передачу идентификатора, расположении они в файле php. ini:session. use_cookies – если этот параметр равен 1, то PHP передает идентификатор в кукисы, если 0 - то не передает. session. use_trans_sid если данная переменная равна 1, то PHP передает его, прибавляя к URL и формам, если 0 - то соответственно не передает.

Сменить эти и другие настройки сессий можно также, как и остальные параметры PHP, отредактировав файл php. ini или при помощи специальной команды ini_set() либо отредактировав файлы настройки веб-сервера. Если включена только 1-я опция, то при каждом старте сессии (каждый раз, когда будет вызываться session_start()), клиенту будут присвоены cookies. При каждом последующем запросе эта cookies возвращается и в PHP существует идентификатор сессии. Проблемы начинаются если браузер не возвращает cookies. В таком случае PHP, не получив cookies с идентификатором, будет все время запускать новую сессию и механизм будет не рабочий.

Если же включена только 2-я опция, то cookies не создается. Здесь начинает свою работу встроенный механизм сессий. После того как начинает выполнятся скрипт и полностью формируется страница, PHP ее полностью просматривает и в конце добавляет к каждой ссылке и форме передачу идентификатора сессии.

Вот как это выглядит:

<a href="/index. php">Index</a>Заменяется на:<a href="/index. php? PHPSESSID=9ebca8bd62c830d3e79272b4f585ff8f">Index</a>А к формам присоединяется скрытое поле:<input type="hidden" name="PHPSESSID" value="00196c1c1a02e4c37ac04f921f4a5eec" />

Таким образом, браузер пошлет запрос с нужной нам переменной – идентификатором сессии, когда мы нажмем на ссылку или кнопку в форме.

В теории можно руками приписать ко всем ссылкам передачу ID в наших самодельных сессиях. Тогда они будут работать и без cookies. Но ведь это тоже работа, и куда более приятней если работа уже выполнена за вас, не правда ли?

На данное время обе опции включены по умолчанию в последних версиях PHP. Как ведет себя PHP в таком случае? Кукисы выставляются всегда, а автодополнение ссылок происходит только после того, если PHP не смог обнаружить cookies с идентификатором сессии. Пользователю, зашедшему в первый раз за этот сеанс присваиваются cookies и происходит дополнение ссылок. Но после следующего запроса, при поддержке cookies, PHP обнаружит их и перестанет производить дополнение ссылок. Если же куки отключены, то PHP исправно продолжает производить автодополнение ссылок ID-шниками, и сессия сохраняется.

У пользователей со включенными куками, ссылка с ID вылетит только один раз.

Все, с передачей идентификатора разобрались. Теперь нужно привязать к нему файл с данными на сервере. PHP сделает эту работу за нас. Нужно только написать: session_start();$_SESSION['test']='Hello world!';После этого, PHP добавит в файл, который связан с данной сессией, переменную test. Но есть одно очень важное замечание.

Массив $_SESSION имеет свои особенности. В нем хранятся переменные, которые мы хотим сделать доступными в разнообразных скриптах. Для того чтобы поместить переменную в сессию, нужно всего лишь присвоить элементу ее массива $_SESSION. Для получения ее значения, необходимо обратится к этому же элементу. Пример вы сможете увидеть немного ниже. Удалением старых файлов (чисткой мусора) тоже занимается PHP, впрочем, как и кодированием данных, да и остальной кучей нужных вещей. Это делает работу с сессиями максимально простой и удобной.

Перейдем к примеру работы сессий. Вот небольшой пример:

<?session_start();if (!isset($_SESSION['counter'])) $_SESSION['counter']=0;echo "Вы обновили эту страницу ".$_SESSION['counter']++." раз. ";echo "<br><a href="/.$_SERVER['PHP_SELF'].">обновить";?>

Здесь мы проверяем, есть ли в нашей сессии переменная counter. В случае если ее нету, то она создается и принимает значение 0, после чего выводится ее значение и увеличивается на единицу. Это самое увеличенное значение сохранится в сессии, и когда в следующий раз будет вызван скрипт, переменная будет со значением 1, и так далее. Все достаточно просто.

Для обеспечения доступа к переменным сессии с любых страниц сайта, необходимо дописать 1 строку в начале каждого файла, в котором мы хотим видеть сессии: session_start();А далее следует обращение к элементам массива $_SESSION. Если взять например авторизацию, то это будет выглядеть где-то так:session_start();if ($_SESSION['authorized']<>1) {header("Location: /auth. php");exit;}

Удаляем переменные из сессии. Если у вас отключена регистрация для всех register_globals=off, то нужно написать:unset($_SESSION['var']);В противном случае, рядом с ней необходимо дописать:session_unregister('var');


Карта сайта


Информационный сайт Webavtocat.ru