ru en uk

  авторизация

(044) 362 48 16   (098) 294 41 60


   Цены

Home   |   WEB development   |   Articles   |   Programming in PHP

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


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


 
Постраничный вывод результата
29.05.2007
Основы безопасности
29.05.2007
Основы безопасности
29.05.2007