Возможно, вам доводилось слышать, что протокол HTTP называют "протоколом без состояния". Это означает, что данный протокол не имеет встроенного способа поддержки состояния между двумя транзакциями. Если пользователь запрашивает одну страницу, а затем другую, то с помощью HTTP невозможно установить, что оба запроса исходят от одного и того же пользователя.
Идея управления сеансами заключается в обеспечении отслеживания пользователя в течении одного сеанса связи с веб-сайтом. Если это удастся, то мы сможем легко обеспечить регистрацию пользователя и предоставление ему информации в соответствии с его правами доступа или персональными настройками. Появится возможность отслеживать поведение пользователя. Кроме того, можно будет реализовать концепцию покупательской тележки.
Начиная с четвертой версии, в PHP появились собственные встроенные версии управления сеансами. Подход к управлению сеансами несколько изменился с вводом суперглабальных переменных и использованием суперглобального массива $_SESSION.
Для управления сеансами в PHP используется уникальный идентификатор сеанса, представляющий собой зашифрованное случайное число. Он генерируется в PHP и сохраняется на стороне клиента на протяжении всего сеанса. Идентификатор сеанса может либо храниться как cookie-набор на компьютере пользователя, либо передаваться в составе URL.
Идентификатор сеанса играет роль ключа, обеспечивающего возможность регистрации некоторых специальных переменных в качестве так называемых переменных сеанса. Содержимое этих переменных сохраняется на сервере. Все, что видно на стороне клиента — это идентификатор сеанса. Если во время некоторого подключения к вашему сайту вы можете "увидеть" идентификатор сеанса либо в cookie-наборе, либо в URL, то можно получить доступ к переменным данного сеанса, которые храняться на сервере. По умолчанию переменные сеанса храняться на сервере в обычных текстовых файлах. Можно написать собственную функцию, чтобы хранить переменные в базе данных, но об этом позже.
Скорее всего, вы уже имели дело с веб-сайтами, запоминающими идентификатор сеанса в URL. Если в вашем URL присутствует строка каких-то случайных данных, то скорее всего, в этом случае используется одна из форм управления сеансами.
Cookie-набор — это небольшой фрагмент информации, который сохраняет сценарии на клиентской машине. Чтобы установит cookie-набор на машине пользователя, необходимо отправить ему HTTP-заголовок, содержащий данные в следующем формате:
Set-Cookie: NAME = VALUE; [expires = DATE;] [path = PATH;] [domain = DOMAIN_NAME;] [secure]
В результате будет создан cookie-набор с именем NAME и значением VALUE. Все остальные параметры являются необязательными. В поле expires задается дата истечения срока cookie-набора. Если дата истечения срока действия не задана, cookie-набор будет постоянно действительным, пока кто-нибудь не удалит его вручную. Два параметра path и domain применяются вместе для определения одного или нескольких URL, к которым относится данный cookie-набор. Ключевое слово secure означает, что cookie-набор не должен пересылаться через простое HTTP-соединение.
Когда браузер соединяется с URL, он сначала просматривает cookie-наборы, хранящиеся на локальной машине. Если какие-либо из них относятся к URL, с которыми установлено соединение, они передаются обратно серверу.
Cookie -наборы в PHP можно установить вручную, воспользовавшись функцией setcookie(). Она имеет следующий прототип:
bool setcookie (string name [ , string value [ , int xpire [ , string path [ , string domain [ , int secure] ] ] ] ] )
Параметры в точности соответствуют параметрам описанного выше заголовка Set-Cookie.
Если cookie-набор установлен как
setcookie ('mycookie', 'value');
то когда пользователь заходит на следующую страницу вашего сайта (или перезагружает текущюю страницу) вы получите доступ к cookie-набору либо через $_COOKIE ['mycookie'], либо через $HTTP_COOKIE_VARS ["mycookie"] или же, если включен режим register_globals, то напрямую через переменную $mycookie.
Для удаления cookie-набора необходимо вызвать setcookie() с тем же именем, нос истекшим сроком действия. Для записи cookie-набора вручную можно воспользоваться функцией header() и описанным выше синтаксисом представления cookie-набора. Однако при этом следует иметь ввиду, что заголовки cookie-наборов должны отправляться перед всеми другими заголовками, иначе они не будут работать.
C cookie-наборами связаны некоторые проблемы: некоторые браузеры не принимают cookie-наборы, кроме того, некоторые пользователи запрещают использование cookie-наборов в браузерах, понимающих cookie. Это одна из причин, по которым в PHP-сеансах используется двойной метод cookie-набоh/URL.
При использовании сеансов нет необходимости устанавливать cookie-наборы вручную. Функции сеанса делают это сами.
Чтобы посмотреть содержимое cookie-набора, установленного текущим сеансом, можно использовать функцию session_get_coocie_params(). Она возвращает массив, содержащий элементы lifetime, path, domain и secure.
Можно воспользоваться также
session_set_cookie_params ($lifetime, $path, $domain [ , $secure] );
для установки параметров cookie-набора сеанса.
Для получения более подробной информации о cookie-наборах следует обратиться к специцикации cookie-наборов, которая доступна на сайте компании Netscape:
http://home.netscape.com/newsref/std/cookie_spec.html
В PHP cookie-наборы в сеансах используются по умолчанию. Если есть возможность установить cookie-наборы, то для сохранения идентификатора сеанса будет применяться именно этот способ.
Другой метод заключается в добавлении идентификатора сеанса к URL-адресу. Можно сделать так, чтобы идентификатор сеанса добавлялся к URL-адресу автоматически — для этого следует установить директиву session.use_trans_sid в файле php.ini. По умолчанию эта директива отключена.
Можно поступить по другому — вручную встроить идентификатор сеанса в ссылку, чтобы обеспечит его передачу. Идентификатор сеанса будет запомитнаться в константе SID. Для того, чтобы передать его вручную, его потребуется добавить в конец ссылки, аналогично GET^
<a href = "linl.php?<?php echo strip_tags(SID); ?>"></a>
Функция strip_tags() здесь служит для того, чтобы сделать невозможным атаки между сайтами с помощью сценариев.
Похожие материалы по теме: