Основы работы с сессиями

Эта статья была написанна мной несколько лет назад. Была опубликованна на разных сайтах:
http://www.php.com.ua/ru/articles/basic/session_start.htm
http://btl-studio.com/o/17/
http://kiev.abcname.net/index.php?o=17
Ну и чтобы добро не пропадало, сделаю кросспост тут.


Что такое сессии и для чего они нужны?

Давайте представим такую ситуацию: у вас есть некоторое количество страниц, вход на которые вы хотите ограничить паролем. У нас есть форма, в которой мы вводим логин и пароль, на следующей странице мы проверяем эти данные на «правильность», если логин и пароль верны, то отображаем содержимое страницы.

Всё бы ничего, но «запароленых» страниц у нас несколько, и логин с паролем надо проверять на каждой. Тут возникает необходимость передачи этих данных между страницами. Конечно, можно было бы передавать логин и пароль методом GET (http://www.domain.org/page.php?login=xyz&pass=1123), но по нескольким причинам так делать не стоит (всем виден пароль). А представим себе случай, когда необходимо передать от скрипта скрипту (от страницы к странице) большое количество информации… И тут возникает мысль: «хорошо было бы иметь возможность передавать нужные нам данные от одного скрипта к другому при просмотре сайта без прямой передачи этих данных от сервера к браузеру и обратно». Таким образом, мы сами подобрались к принципу работы сессий.


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

Сессии — это механизм, созданный для временного хранения и передачи информации между скриптами в пределах одного сайта.

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

Сессии с точки зрения программиста
Чтобы запустить механизм сессии в скрипте (создать сессию) необходимо воспользоваться функцией session_start(). Эта функция должна стоять в Вашем скрипте до того, как скрипт начнет вывод информации (зачем — объясним ниже). После создании сессии мы получаем доступ к суперглобальному массиву $_SESSION, который обладает полезными свойствами. Так, помещенная в него информация будет доступна нам в любом скрипте в любой функции данного сайта в течении сеанса работы с сайтом. Сеанс прекращается когда пользователь закроет браузер или по прошествии определенного времени, в течении которого пользователь не совершал переходов по сайту. Это время определяется опцией session.gc_maxlifetime в файле php.ini и определяет время, по прошествии которого файл сессии будет рассматриваться как устаревший.

Существует также массив $HTTP_SESSION_VARS, которым можно пользоваться при работе с сессиями. Но этот массив не является суперглобальным, плюс имя его содержит больше букв, а значит нужно потратить больше времени на его написание. В общем, пользоваться этим массивом я не рекомендую.

Более пристальный взгляд на механизм работы сессий
Передача данных от скрипта к скрипту согласно механизму работы сессий состоит из создания файла, записи данных в файл, открытии файла чтении данных и тд. Итак, изначально этот механизм опирается на файлы. Как уже упоминалось, при необходимости, данные сессии можно хранить в базе данных или просто в памяти. Для этого необходимо воспользоваться функцией session_set_save_handler() и/или опцией session.save_handler в файле php.ini

Идентификатор сессии.
При старте сессии создается специальный файл, в котором хранятся данные, переданные с помощью сессии. Для идентификации конкретной сессии конкретного пользователя используется так называемый идентификатор сессии. Идентификатор представляет из себя 128 битное число типа 523afa15f4a8e05e95241481c0cbc71e, которое при старте сессий выбирается случайным образом. В итоге, мы имеем файл, в имени которого присутствует уникальный идентификатор равный идентификатору сессии.

Передача идентификатора сессии
Существует два способа передачи идентификатора сессии между сервером и браузером:

  • Куки
  • Как параметр в URL

Использование cookies – если у пользователи куки включены PHP процессор сам помещает туда переменную со значением идентификатора, и в нужный момент читает ее от туда, причем включены у клиента куки или нет – php определяет самостоятельно.

Что такое cookie?
Cookie это небольшая порция информации, которую сервер передает клиенту. Клиент (броузер) будет хранить эту информацию и передавать ее серверу с каждым запросом как часть HTTP заголовка. Некоторые cookie хранятся только в течение одной сессии, они удаляются после закрытия броузера. Другие, установленные на некоторый период времени, данные записываются в файл.

Использование параметров – этот метод используется PHP если куки отключены. Суть метода в том, что PHP процессор анализирует весь код, предназначенный для отображения в браузере, и производит автозамену всех ссылок таким образом, чтобы идентификатор сессии мог передаться на следующую страницу посредством метода GET или POST.


Примеры автозамены:

Код до обработки php-процессором:
<a href=page.php>link</a>

Код после обработки php-процессором:
<a href=page.php?PHPSESSID=523afa15f4a8e05e95241481c0cbc71e>link</a>

Код до обработки формы php-процессором:
<form action=page.php>
</form>

Код после обработки формы php-процессором:
<form action=page.php>
<input type="hidden" name="PHPSESSID" value="523afa15f4a8e05e95241481c0cbc71e">
</form>

Выводы

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

Часто используемые параметры и функции для сессий

session_start(); — запускает механизм сессий для текущего скрипта.

Предупреждение:
Если Вы хотите, чтобы ваш сценарий работал независимо от register_globals, Вам нужно использовать массив $_SESSION так как данные которые находятся в этом массиве автоматически регистрируются. Если ваш сценарий использует session_register(), он не будет работать в средах где директива PHP register_globals выключена.


Рекомендуется использовать такую конструкцию для регистрации переменных в сесии

$_SESSION[‘name’]=”Василий”;

session_destroy(); — уничтожаются данные, хранящиеся в сессии, сам файл сессии и его идентификатор.

session_name(); — эта функция возвращает название переменной, которая используется для хранения идентификатора сессии.

session_id(); — сам идентификатор сессии.

session.name – параметр в php.ini устанавливающий имя переменной для хранения идентификатора сессии, по умолчанию значение – PHPSESSID.

session.auto_start – параметр включающий/выключающий автоматический старт сессий. Если значение этого параметра – 1, то сессии стартуют автоматически и использовать session_start() не надо, если значение параметра – 0, то сессии не будут стартовать автоматически. По умолчанию значение 0.

session.use_cookies – параметр указывающий PHP процессору использовать ли куки для хранения идентификатора или нет. По умолчанию PHP-процессору разрешено использовать cookies для хранения идентификатора сессии, и значение этого параметра равно 1.

Остальные параметры и функции для работы с сессиями используются сравнительно редко, и поэтому я не стану приводить их описание в этой статье. Но если у вас всё-таки есть желание, то вы всегда можете ознакомиться с ними тут: http://ua.php.net/manual/ru/ref.session.php

Пример использования сессий

Сейчас я на простейшем примере продемонстрирую как хранятся и передаются данные при помощи механизма сессий.

index.php
<form action=page1.php method=”GET”>
Введите ваше имя <input type=text name=login>
<input type=submit>
</form>

page1.php
<?php // внимание!!! До <?php не должно быть пробелов или пустых строк
session_start();
// включаем поддержку сессий и генерируем случайный
// идентификатор сессии

$_SESSION[‘login’]=”root”;
// регистрируем переменную $login как переменную сессии.

print "На предыдущей странице вы ввели имя <b>$_GET[‘login’]</b>. Ваше имя уже хранится в файле сессии.<br />
Перейдите по ссылке на следующую страницу<p>

<a href=”page2.php”>Ссылка на следующую страницу</a>";
// делаем ссылку для перехода на следующую страницу
// в эту ссылку при помощи механизма автозамены
// будет подставлен идентификатор сессии
?>

page2.php
<?php // внимание!!! До <?php не должно быть пробелов или пустых строк
session_start();
// снова включаем поддержку сессий

print "Ваше имя, переданное при помощи механизма сессий: <b>$_SESSION[‘login’]</b>";
// выводим содержимое переменной $login
// которая хранится в файле сессий
?>

На этом я заканчиваю свою статью, и желаю вам успехов в дальнейшем изучении PHP!

Share

Comments

  1. Примкр довольно простосой а ошибок немереоно !

  2. Примкр довольно простой а ошибок немереоно !

  3. Петька Сокольников
    07.07.2011 - 11:05

    @Вася
    Василий, вы написали всего одно предложение, но в нём масса пунктуационных и орфографических ошибок. Вам надо работать на собой.

  4. День добрый. Довольно хороший теоретический материал, на примере мало показано.
    Хотелось бы добавить, что session_start() может выдавать ошибку, если перед пхп началом пхп кода нет пробелов, в случае, если кодировка используется утф-8. Именно по этой причине я перешел повсеместно на утф-8 без BOM.
    Спасибо за статью )

  5. И да, ссылка на ваш профиль в комментариях битая.

  6. @Сева
    Спасибо, подправил ссылку в профиле.

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

Your email address will not be published / Required fields are marked *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.