Работа с Cookie на PHP

История

Источник термина "cookie" достоверно не известен, хотя считается, что во времена зарождения Unix-систем использовалось словосочетание "Magic Cookies". Под этим словосочетанием понимались "квитанции" (ticket, token), которыми обменивались программы.

Назначение

По своей сути механизм Cookie является решением одной из остро стоящих проблем HTTP протокола. Если кратко, то смысл данной проблемы в непостоянном соединения между клиентом (браузером) и сервером: для каждого документа (или файла) при передаче по HTTP протоколу посылается отдельный запрос, а от сервера приходит ответ, каждый запрос при этом независим от остальных. Иначе говоря, транзакция завершается после того, как браузер сделал запрос, а сервер выдал соответствующий ответ. Сразу после этого сервер "забывает" о пользователе и каждый следующий запрос того же пользователя считает новым пользователем. Включение же cookie в HTTP протокол дает частичное решение проблемы. 

Используя cookie, можно эмулировать сессию по HTTP протоколу: при первом запросе выдается соответствующее значение cookie, а при каждом последующем запросе это значение читается из переменной окружения HTTP_COOKIE и обрабатывается.

Работа с cookie с использованием PHP

Работа с cookie в php на удивление проста. Для установки значения cookie в языке php есть метод setcookie() . Самое интересное, что метод setcookie() воспринимает до шести аргументов, в зависимости от того, как вы собираетесь управлять значениями cookie и кто будет считывать ее значения.

Простейший способ установить cookie:

setcookie('name', 'value');

Затем, для каждой последующей страницы на Вашем сайте, просматриваемой в течение данной сессии (пока пользователь не покинет сайт) переменная $name будет иметь значение 'value' и его можно легко прочитать средствами PHP. Этот простейший тип cookie известен как cookie-сессия, поскольку значение сохраняется в течение пользовательской сессии.

Если же Вы хотите, чтобы значение cookie запоминалось браузером и после того, как пользователь закончит сессию, Вы должны передать функции setcookie() третий параметр - дату истечения срока действия cookie. Поскольку PHP сформировался в основном в среде Unix, Вы должны передать дату в Unix формате. Сформировать время в этом формате проще всего использовав метод mktime() . Вы указываете ей в качестве параметров час, минуту, секунду, месяц, день и год, задающие тот момент времени, который Вы хотите представить в воспринимаемом UNIX формате, и mktime() возвращает Вам число секунд, прошедших с 1 января 1970 г. до указанного момента времени.:

<?php

$y2k = mktime(0,0,0,1,1,2000);

setcookie('name', 'value', $y2k);

?>

Обратите внимание на то, что при этом не меняется значение переменной $name. Оно устанавливается при загрузке страницы. Если Вы хотите чтобы значение переменной изменялось синхронно с изменением значения cookie, Вы должны изменить код следующим образом:

<?php

$name = 'value';

$y2k = mktime(0,0,0,1,1,2000);

setcookie('name', $name, $y2k);

?>

Следующие два параметра функции setcookie() позволяют Вам задать путь и имя домена того, кто может прочитать значение Вашего cookie. По умолчанию только страницы, расположенные в том же каталоге или ниже в структуре подкаталогов того сервера, который установил cookie, могут прочитать его значение. Это делается из соображений безопасности. Однако, если у Вашего сервера два доменных имени: "www.domain.com" и "other.domain.com", и Ваш аккаунт позволяет Вам обслуживать страницы из каталога ~/myhome, Вы должны вызывать функцию setcookie() следующим образом:

<?php

setcookie('name', 'value', $y2k, '~/myhome', '.domain.com');

?>

Последний параметр функции setcookie() , который мы никогда не использовали, требует, чтобы значение cookie передавалось только на те Web-сервера, которые испольуют безопасный протокол соединения, такой как SSL. Если Вам это нужно, то задайте для шестого параметра значение 1.

Удалить cookie тоже очень просто, достаточно передать функции setcookie() имя cookie и PHP сделает все остальное:

<?php setcookie('name'); ?>

В заключение нужно сделать еще одно замечание, касающееся использования cookie. В силу того, как организована обработка cookies в протоколе HTTP, необходимо установить значения всех cookie до вывода какого-либо текста. Если сделать наоборот, PHP выдаст Вам предупреждение и значение cookie не будет послано. Вот так правильно:

<?php

setcookie('name', 'value');

echo "Hello Everyone!";

?>

А данный код уже вызовет ошибку

<?phpecho "Hello Everyone!"setcookie('name', 'value');?>

Ограничения на использование cookie

Клиент (браузер) имеет следующие ограничения для cookies:

  • всего может храниться до 300 значений cookies;
  • каждый cookie не может превышать 4Кбайт;
  • с одного сервера или домена может храниться до 20 значений cookie.

Если ограничение 300 или 20 превышается, то удаляется первая по времени запись. При превышении лимита объема в 4Кбайт корректность значения cookie страдает - отрезается кусок записи (с начала этой записи) равный превышению объема.

В случае кэширования документов, например, proxy-сервером, поле Set-cookie HTTP заголовка никогда не кэшируется.

Если proxy-сервер принимает ответ, содержащий поле Set-cookie в заголовке, предполагается, что поле доходит до клиента вне зависимости от кода возврата 304 (Not Modified) или 200 (OK). Соответственно, если клиентский запрос содержит в заголовке Cookie, то он должен дойти до сервера, даже если жестко установлен параметр If-modified-since.

Партнерство

Rookee - мощный инструмент по продвижению сайтов в руках профессионалов: