Что такое сессии и для чего они нужны? Давайте представим такую ситуацию: у вас есть некоторое количество страниц, вход на которые вы хотите ограничить паролем. У нас есть форма, в которой мы вводим логин и пароль, на следующей странице мы проверяем эти данные на «правильность», если логин и пароль верны, то отображаем содержимое страницы. Всё бы ничего, но «запароленых» страниц у нас несколько, и логин с паролем надо проверять на каждой. Тут возникает необходимость передачи этих данных между страницами. Конечно, можно было бы передавать логин и пароль методом 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 хранятся только в течение одной сессии, они удаляются после закрытия броузера. Другие, установленные на некоторый период времени, данные записываются в файл. Обычно этот файл называется 'cookie.txt'.
Использование параметров – этот метод используется 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! |