Введение
Часто сайты должны уметь идентифицировать своих посетителей, чтобы сохранять и показывать им позже какую-либо информацию.
Например, интернет-магазины могут сохранять историю просмотров, чтобы рекомендовать потенциальным покупателям наиболее подходящие им товары. Или агрегатор новостей мог бы предложить пользователям выбирать только интересующие их рубрики.
К счастью HTTP и все браузеры предоставляют возможность сохранения информации о пользователе.
Cookie (куки) представляют небольшие наборы данных (не более 4 кБайт), которые веб-сервер отправляет браузеру. Браузер сохраняет их у себя, а при следующем посещении веб-страницы отправляет обратно. Благодаря этому, веб-сервер сможет узнать своего «старого» посетителя. С помощью куки можно отслеживать активность пользователя на сайте: залогинен пользователь на сайте или нет, отслеживать историю его визитов и т.д.
С технической стороны, куки — это обычные HTTP-заголовки.
PHP может управлять заголовками, которые отправляет сервер, а значит, может устанавливать и читать куки.
Чтобы добавить новую куку, необходимо вначале определиться со следующими критериями:
- Название куки (может состоять только из символов латинского алфавита и цифр);
- Значение, которое предполагается хранить;
- Срок жизни куки — это обязательное условие.
Когда веб-сервер хочет записать куку в браузер пользователя, он отсылает специальный заголовок ответа с названием Set-Cookie
. В этом заголовке должна содержаться необходимая информация и дополнительные аттрибуты, о которых пойдёт речь далее.
В следующий раз, когда браузер пользователя запросит веб-страницу с того же сайта, в числе прочих заголовков браузер передаёт заголовок запроса Cookie
. Веб-сервер получит эту информацию, и она будет доступна также и для PHP.
Функция setcookie()
Для установки куки на компьютере пользователя используется функция setcookie(). Она должна вызываться перед тем, как будет отправлен ответ пользователю. Эта функция имеет следующее определение:
bool setcookie(string $name, string $value, int $expire, string $path, string $domain, bool $secure, bool
$httponly);
Функция setcookie()
может принимать следующие параметры:
name
: имя cookie, которое будет использоваться для доступа к его значениюvalue
: значение или содержимое cookie – любой алфавитно-цифровой текст не более 4 кБайтexpire
(необязательный параметр): срок действия в секундах, после которого cookie уничтожаются. Если данный параметр не установлен или равен 0, то уничтожение cookie происходит после закрытия браузера. Обычно устанавливается относительно текущего времени, которое можно получить с помощью функцииtime()
path
(необязательный параметр): путь к каталогу на сервере, для которого будут доступны cookie. Если задать “/”, cookie будут доступны для всего сайта. Если задать, например,"/mydir/"
, cookie будут доступны только из каталога /mydir/ и всех его подкаталогов. По умолчанию значением является текущий каталог, в котором устанавливаются cookie.domain
(необязательный параметр): задает домен, для которого будут доступны cookie. Если это домен второго уровня, например, localhost.com, то cookie доступны для всего сайта localhost.com, в том числе и для его поддоменов типа blog.localhost.com. Если задан поддомен blog.localhost.com, то cookie доступны только внутри этого поддомена.secure
(необязательный параметр): указывает на то, что значение cookie должно передаваться по протоколу HTTPS. Если заданоtrue
, cookie от клиента будет передано на сервер, только если установлено защищенное соединение. По умолчанию равноfalse
.httponly
(необязательный параметр): если равноtrue
, cookie будут доступны только через http протокол. То есть cookie в этом случае не будут доступны скриптовым языкам, например, JavaScript. По умолчанию параметр равенfalse
.
Сохранение cookie
<?php
$name = "Tom";
$age = 36;
setcookie("name", $name);
setcookie("age", $age, time() + 3600); // срок действия - 1 час (3600 секунд)
setcookie("visit_count", 1, strtotime("+30 days"));
echo "Куки установлены";
?>
Здесь устанавливаются три куки: “name”, “age” и “visit_count”. Первая куки уничтожается после закрытия браузера, а вторая – через 3600 секунд, то есть через час, третья устанавливается на 30 дней.
При необходимости мы можем увидеть сохраненные куки в браузере с помощью инструментов разработчика. Например, вид куки в Google Chrome:
В cookie можно сохранить любую информацию, но не стоит сохранять важные с точки зрения безопасности данные, например, пароли.
Получение cookie
В PHP максимально упрощён процесс чтения информации из cookies. Поэтому все переданные сервером куки доступны в специальном глобальном массиве $_COOKIE
.
Так, чтобы получить содержимое куки с именем visit_count
, достаточно обратиться к одноимённому элементу массива $_COOKIE
, например, вот так:
<?php
print($_COOKIE["visit_count"]);
?>
Обратите внимание: установив в сценарии куку через setcookie
, прочитать её можно будет только при следующем посещении страницы.
Сохранение массивов в cookie
Сохранение в куки массивов имеет некоторые особенности. Например, сохраним следующий массив:
setcookie("lang[1]", "PHP");
setcookie("lang[2]", "C#");
setcookie("lang[3]", "Java");
Теперь получим его и выведем на страницу:
if (isset($_COOKIE["lang"])) {
foreach ($_COOKIE["lang"] as $name => $value) {
$name = htmlspecialchars($name);
$value = htmlspecialchars($value);
echo "$name. $value <br />";
}
}
Удаление cookie
Для удаления cookie достаточно в качестве срока действия указать какое-либо время в прошлом:
setcookie ("name", "", time() - 3600);
Собираем всё вместе
Теперь, научившись устанавливать и читать куки, напишем полноценный сценарий, который будет считать и выводить количество посещений страницы пользователем:
<?php
$visit_count = 1;
if (isset($_COOKIE["visit_count"])) {
$visit_count = $_COOKIE["visit_count"] + 1;
}
setcookie("visit_count", $visit_count, strtotime("+30 days"));
print("Количество посещений: " . $visit_count);
?>