ru en uk

  авторизация

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



Home   |   Articles   |   Programming in PHP

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


Давайте представим такую ситуацию: у вас есть некоторое количество страниц, вход на которые вы хотите ограничить паролем. У нас есть форма, в которой мы вводим логин и пароль, на следующей странице мы проверяем эти данные на «правильность», если логин и пароль верны, то отображаем содержимое страницы.
Всё бы ничего, но «запароленых» страниц у нас несколько, и логин с паролем надо проверять на каждой. Тут возникает необходимость передачи этих данных между страницами. Конечно, можно было бы передавать логин и пароль методом GET , но по нескольким причинам так делать не стоит (всем виден пароль). А представим себе случай, когда необходимо передать от скрипта скрипту (от страницы к странице) большое количество информации... И тут возникает мысль: «хорошо было бы иметь возможность передавать нужные нам данные от одного скрипта к другому при просмотре сайта без прямой передачи этих данных от сервера к браузеру и обратно». Таким образом, мы сами подобрались к принципу работы сессий.

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


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

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



Сессии с точки зрения программиста
Чтобы запустить механизм сессии в скрипте (создать сессию) необходимо воспользоваться функцией 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-процессором:


link



Код после обработки php-процессором:


link



Код до обработки формы php-процессором:






Код после обработки формы php-процессором:






Выводы


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

Если Вам необходима разработка сайта Киев - тогда обращайтесь в компанию ABCname

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



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.

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


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

index.php



Введите ваше имя 




page1.php


// внимание!!! До session_start(); 
// включаем поддержку сессий и генерируем случайный 
// идентификатор сессии

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

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



Ссылка на следующую страницу"
;
// делаем ссылку для перехода на следующую страницу
// в эту ссылку при помощи механизма автозамены
// будет подставлен идентификатор сессии
?>



page2.php


// внимание!!! До session_start();
// снова включаем поддержку сессий

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



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


 
Блокировка файлов
29.05.2007
"Warning! On most operation systems flock() is implemented at the process level. When using a multithreaded server API like ISAPI you cannot rely on flock() to protect files against other PHP scripts running in parallel threads of the same server instance!"
Блокировка файлов
29.05.2007
"Warning! On most operation systems flock() is implemented at the process level. When using a multithreaded server API like ISAPI you cannot rely on flock() to protect files against other PHP scripts running in parallel threads of the same server instance!"
Введение в PHP5
29.05.2007
PHP5 ещё официально не вышел, но "рабочие" версии уже трудоспособны (равно как и нестабильны!), так что мы вполне можем начать изучение новых возможностей грядущего релиза PHP и попрактиковать с ними. В этой статье мы поговорим о трёх основных нововведениях в PHP5