Сессии и cookie

Сессии и cookie

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

Работа с cookie

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

Для создания cookie предназначена функция setcookie(), которая имеет следующий синтаксис:

bool setcookie ($name [, $value [, $expire [, $path [, $domain [, $secure]]]]])

Функция принимает следующие аргументы:

Данная функция возвращает true при успешной установке cookie на машине клиента и false —в противном случае. После того как cookie установлен, его значение можно получить на всех страницах веб-приложения, обращаясь к суперглобальному массиву $_COOKIE и используя в качестве ключа имя cookie.

Так как cookie передается в заголовок НTTP-запроса, то вызов функции setcookie() необходимо размещать до начала вывода информации в окно браузера функциями echo(), print() и т.д., а также до включения в файл HTML-тегов.

Примечание. Файл для cookie создается только в том случае, если выставляется время жизни cookie; в противном случае cookie действует только до конца сеанса, т.е.до того момента, пока пользователь не закроет окно браузера.

Подсчет количества обращений с странице

<?php
//высталяем уровень обработки ошибок
error_reporting(E_ALL & ~E_NOTICE);
//увеличиваем значение cookie
$_COOKIE['counter']++;
//устанавливаем cookie
setcookie(counter, $_COOKIE['counter']);
//выводим значение cookie
echo "Вы посетили эту страницу $_COOKIE[counter] раз";
?>

В окне веб-браузера это будет выглядеть ТАК.

Мы реализовали установку cookie с именем counter, значение которой увеличивается при каждой перезагрузке страницы.

Время жизни cookie задается при помощи функции time() или mktime().

Установка cookie с определенным временем жизни

<?php
//cookie действительна в течении 10 минут после создания
setcookie("name", "value", time()+600);
//действия этой cookie прекращаются в полночь 25 января 2010 года
setcookie("name", "value", mktime(0,0,0,1,25,2010));
//действия этой cookie прекращаются в 18.00 25 января 2010 года
setcookie("name", "value", mktime(18,0,0,1,25,2010));
?>

Примечание. В большинстве современных систем, где время представляется 32-битным целым числом, допустимыми являются значения года между 1901 и 2038. Типичной ошибкой при работе с cookie является установка года, выходящего за пределы этого интервала, например, 2100. В этом случае cookie будут устанавливаться как сессионные.

Ограничить доступ к cookie со всех страниц, кроме расположенных в определенном каталоге (например, /web), можно при помощи четвертого каталога.

Ограничение доступа к cookie

<?php
setcookie("name", "value", time()+600, " /web");
?>

В этом случае каталоги /web/index.php, /web1/page.html и т.д. будут удовлетворять этому ограничению. Если это не желательно, можно ограничить область видимости cookie до конкретной страницы.

Сужение области видимости cookie

<?php
setcookie("name", "value", time()+600, " /web/index.php");
?>

Однако такой способ в полной мере не решает проблему, так как в этом случае доступ к информации, содержащейся в cookie, моджет получить к примеру, скрипт /web/index.php-script/anti_cookie.php. Во избежание доступа посторонних хостов можно еще более сузить область видимости cookie, задав хост, страницы которого имеют доступ к cookie.

<?php
setcookie("name", "value", time()+600, " /", "sevidi.ru");
?>

Уничтожить cookie можно, установив нулевое время жизни.

Удаление cookie

<?php
setcookie("name", "value");
?>

Примечание. Следует помнить, что для уничтожения cookie с ограничениями по каталогу и директории необходимо выставлять точно такие же ограничения для его удаления, в противном случае он не будет уничтожен.

Сookie можно устанавливать в обход фкнкции setcookie(), используя НTTP-заголовок Set-Cookie и функцию header().

<?php
$cookie = "Set-Cookie: name = value;".
"expires = Thu, 30-Aug-2009 13:00:04 GMT;".
"path = /;".
"domain = sevidi.ru";
header($cookie);
?>

Нередко посетители отключают cookies в настройках своих браузеров. Для корректрой работы в веб-приложение, использующее cookie, необходимо помещать код, проверяющий, включены ли cookies у посетителя. Такая проверка позволит использовать другой механизм аутентификации, например сессии, или просто позволит вывести сообщение о необходимости включить cookies.

Проверка, включены ли cookies

<?php
//выставляем уровень обработки ошибок
error_reporting(E_ALL & ~E_NOTICE);
if(!isset($_GET['probe']))
{
//устанавливаем cookie с именем "test"
if(setcookie("test", "set"))
//отправляем заголовок переадресации на страницу,
//с которой будет предпринята попытка установить cookie

header ("Location: $_SERVER[PHP_SELF] ?probe=set");
}
else
{
if(!isset($_COOKIE['test']))
{
echo "Для корректной работы приложения необходимо включить cookies";
}
else
{
echo "Сookies включены";
}
}
?>

В окне веб-браузера это будет выглядеть ТАК.

Примечание. Суперглобальный массив $_SERVER содержит переменные окружения, которые веб-сервер передает скрипту. Среди переменных окружения наибольшей популярностью пользуется $_SERVER[PHP_SELF], сообщающая имя текущего файла. Текущие значения переменных окружения можно посмотреть в отчете, формируемым функцией phpinfo().

В рассмотренном примере, для проверки корректности работы cookies при помощи функции setcookie() устанавливается пробноезначение cookie. Функция setcookie() в данном случае принимает два параметра, первый из которых представляет собой имя, а второй значение cookie. Далее осуществляется перегрузка текущей страницы с передачей через GET-параметр probe значения set, тем самым сообщая скрипту, что проверка выполнена и необходимо проверить, содержит ли что-нибудь элемент $_COOKIE['test']. Если данный элемент не установлен — cookies отключены, если он содержит значение — включены.

Работа с сессиями

Сессия во многом походит на cookie и представляет собой текстовой файл хранящий пары ключ/значение, но уже не на машине клиента, а на сервере. Во многих случаях сессии являются более предпочтительным вариантом, чем cookies.

Так как на сервере скапливается большое количество файлов, принадлежащих сессиям разных клиентов, то для их идентификации каждому новому клиенту назначается уникальный номер — идентификатор сессии (SID), который передается либо через строку запроса, либо через cookie, если они доступны. К недостаткам сессий относится невозможность контроля времени их жизни из РНР-скриптов, так как этот параметр задается в конфигурационном файле php.ini директивой session. cookie_lifetime.

Примечание. Оба механизма, сессии и cookie, взаимно дополняют друг друга. Сookies хранится на машине посетителя, и продолжительность их жизни определяет разработчик. Обычно они применяются для долгосрочных задач (от нескольких часов) и хранения информации, которая относится исключительно к конкретному посетителю (личные настройки, логины, пароли и т.д.). В свою очередь, сессии хранятся на сервере, и продолжительность из существования (обычно не большую) определяет администратор сервера. Они предназначены для краткосрочных задач (до нескольких часов) и хранения и обработки информации обо всех посетителях в целом (количество посетителей on-line и т.д.). Поэтому использовать тот или иной механизм следует в зависимости от преследуемых целей.

Примечание. Директива session.seve_path в конфигурационном файле php.ini позволяет задать путь к каталогу, в котором сохраняются файлы сессий; это может быть удобным для отладки веб-приложений на локальном сервере. Если данная директива не задана, сесси хранятся в оперативной памяти сервера.

& Сессия инициируется при помощи функции session_start(), которая имеет следующий синтаксис:

dool session_start()

Функция возвращает true в случае успешной инициализации сессии и false — в противном случае. Для работы с сессией функция session_start() должна вызываться на каждой странице, где происходит обращаение к переменным сессии.

Примечание. Точно так же, как и функция setcookie(), функция session_start() должна вызываться до начала вывода информации в окно браузера, т.к. уникальный идентификатор сессии SID зачастую передается через cookie, т.е. посредством НTTP-заголовка Set-Cookie.

После инициализации сессии появляется возможность сохранить информацию в суперглобальном массиве $_SESSION.

Помещаем данные в суперглобальный массив $_SESSION

<?php
//инициирум сессию
session_start();
//помещаем значение в сессию
$_SESSION['name']="value";
//помещаем массив в сессию
$arr=array("first", "second", "third");
$_SESSION['arr']=$arr;
//выводим ссылку на другую страницу
echo "<a href=phpstage58.html>другая страница </a>"
?>

В окне веб-браузера это будет выглядеть ТАК.

На страницах, где происходит вызов функции session_start(), значения данных переменных можно извлечь из суперглобального массива $_SESSION. Сохраним скрипт в файле 385php.

Извлечение данныз из суперглобального массива $_SESSION

<?php
//инициирум сессию
session_start();
//выводим содержимое суперглобального массива $_SESSION
echo "<pre>";
print_r($_SESSION);
echo "</pre>";
?>

Результат работы скрипта:

Array  
(      
 [name] => value     
 [arr] => Array         

     (              
       [0] => first             
       [1] => second             
       [2] => third         
      )   
 )  

Завершить работу сессии можно вызвав функцию session_destory(), которая имеет следующий синтаксис:

bool session_destory()

Функция возвращает true при успешном уничтожении сессии и false — в противном случае. Если, достаточно не уничтожать сессию, а лишь обнулить все значения, хранящиеся в сессии, следует вызвать функцию session_unset(), которая уничтожит все элементы суперглобального массива $_SESSION текущей сессии. Данная функция, так же как и функция session_destory(), не принимает ни одного парметра и true в случае успеха и false — вслучае неудачи.

Если требуется уничтожить какой-то один элемент в суперглобальном массиве $_SESSION, то следует использовать функцию unset():

unset ($_SESSION['name'])

Eще одной полезной функцией является функция session_id(), позволяющая узнать текущий идентификатор сессии или задать собственный идентификатор и имеющая следующий синтаксис:

string session_id([$id])

Функция возвращает текущий идентификатор сессии. Необязательный параметр $id позволяет задать собственный идентификатор сессии, который длжен состоять из строчных или прописных букв латинского алфавита и цифр. При задании собственного идентификатора функция session_id() должна вызываться функцией session_start().

Узнаем текущий идентификатор сессии

<?php
//инициирум сессию
session_start();
//узнаем текущий идентификатор сессии
echo session_id();
?>

В окне веб-браузера это будет выглядеть ТАК.

назадвверхвперед
Rambler's Top100