#8 php Куки (cookies): счётчик посещений на setcookie и $_COOKIE - урок для начинающих

Все наши страницы пока были «без памяти»: сервер обрабатывал каждый запрос так, будто видит посетителя впервые. Но сайты умеют «узнавать» своих — и начинают эту историю куки. Сделаем страницу-счётчик: она покажет, сколько раз вы её открывали.

Немного теории

По протоколу HTTP каждый запрос сам по себе: сервер не помнит, кто уже приходил на сайт, а кто еще нет.
Куки (cookies) — способ дать запросам «память»: сервер в ответе просит браузер запомнить пару «имя=значение» (заголовок Set-Cookie), и браузер прикладывает её ко всем следующим запросам к этому сайту. В PHP установка куки — функция setcookie().

Как это работает

  1. браузер впервые открывает страницу;
  2. PHP видит, что куки visits ещё нет, считает визит первым — и в ответе просит браузер: «запомни visits=1»;
  3. браузер сохраняет куку;
  4. при следующем запросе браузер сам прикладывает visits=1 — PHP читает её, выводит 2 и просит запомнить visits=2 — и так по кругу.

Код страницы

<?php
$visits = 0;
if (isset($_COOKIE['visits'])) {
    $visits = (int) $_COOKIE['visits'];
}
$visits = $visits + 1;
setcookie('visits', (string) $visits);
?>
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Счётчик посещений</title>
</head>
<body>
  <h1>Счётчик посещений</h1>
  <p>Количество ваших визитов: <?php echo $visits; ?></p>
</body>
</html>

Обратите внимание: PHP-блок стоит до <!DOCTYPE html>. Это не случайно — setcookie() отправляет заголовок ответа, а заголовки, как и header() из урока про редирект, уходят до любого вывода.

Разберём новые моменты:

  • $_COOKIE — массив пришедших кук, в полном соответствии с $_GET и $_POST;
  • (int) превращает строку из куки в число — про преобразования типов читайте в учебнике: преобразование в строки и из строк;
  • (string) при установке — наоборот, записывает число строкой;
  • срок жизни куки мы не указали, поэтому она живёт, пока открыт браузер.

Проверяем

Откройте http://localhost:19791/lessons/lesson08-cookie-counter/ и обновите страницу несколько раз — счётчик растёт: 1, 2, 3... А теперь откройте её в режиме инкогнито (или в другом браузере): счётчик начнётся заново — куки у каждого браузера свои.

Можно ли кукам верить

Куки хранятся у посетителя: их видно в браузере, можно удалить, а значение — подменить. Поэтому в куках не хранят секретов и не верят им без проверки — это просто «записка», которую браузер честно возвращает серверу. Как хранить состояние, которому сервер может доверять, — тема следующего урока.

Попробуйте сами

  • в DevTools (F12 → Application → Cookies) найдите куку visits и сверьте её значение со счётчиком;
  • удалите куку там же и обновите страницу — счётчик сбросится;
  • задайте куке срок жизни: третьим аргументом setcookie('visits', ..., time() + 3600) — «на час» (документация time());
  • посложнее: при первом визите показывайте «Вы здесь впервые!».

Итоги

  • HTTP сам по себе не помнит посетителей — куки добавляют запросам «память»;
  • setcookie() просит браузер запомнить значение, $_COOKIE — прочитывает пришедшее;
  • setcookie(), как и header(), работает только до любого вывода;
  • куки — данные на стороне клиента: их видно и можно подделать.

В следующем уроке — сессии: научимся хранить данные о посетителе на самом сервере.