W3docs

Функция PHP setcookie(): всё, что нужно знать

Функция setcookie() в PHP позволяет устанавливать cookies для хранения данных на стороне клиента. Узнайте синтаксис, чтение и удаление cookies.

Как PHP-разработчику, вам может потребоваться устанавливать cookies для хранения информации на стороне клиента. Функция setcookie() — это встроенная функция PHP, которая решает эту задачу. В этой статье мы рассмотрим её современный синтаксис, способы установки, чтения и удаления cookies, наиболее распространённые подводные камни, а также когда лучше использовать сессии.

Что такое функция setcookie()?

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

Поскольку cookie является HTTP-заголовком, функция setcookie() должна вызываться до отправки любого вывода в браузер. Сам cookie не становится доступным немедленно; он появляется в суперглобальном массиве $_COOKIE только при следующем запросе, когда браузер отправит его обратно.

Как использовать функцию setcookie()

Использовать функцию setcookie() несложно. Синтаксис на основе массива опций был введён в PHP 7.3. В PHP 8.1 устаревший позиционный синтаксис с семью параметрами был объявлен устаревшим. Вот современный синтаксис:

Синтаксис PHP функции setcookie()

setcookie($name, $value, $options);

Параметр $options — это ассоциативный массив, который принимает следующие ключи:

  • expires: Время истечения срока действия cookie (временная метка Unix).
  • path: Путь на сервере, для которого будет доступен cookie.
  • domain: Домен, для которого будет доступен cookie.
  • secure: Должен ли cookie передаваться только по HTTPS.
  • httponly: Должен ли cookie быть доступен только через HTTP.
  • samesite: Ограничивает cookie запросами с того же сайта. Принимает значения 'Strict', 'Lax' или 'None'. Примечание: при использовании 'None' необходимо также установить secure в true, иначе современные браузеры отклонят cookie.

Если не указывать expires (или установить его в 0), cookie становится сессионным — он существует только до закрытия браузера. Установка expires на будущую временную метку превращает его в постоянный cookie, который сохраняется после перезапуска браузера.

Вот пример использования функции setcookie() для установки cookie:

Как использовать функцию setcookie()?

<?php

$options = [
    'expires'  => time() + (86400 * 30), // 30 days
    'path'     => '/',
    'domain'   => '.example.com',
    'secure'   => true,
    'httponly' => true,
    'samesite' => 'Lax'
];
setcookie('username', 'john', $options);

В этом примере мы используем функцию setcookie() для установки cookie с именем username и значением john. Мы также указываем время истечения срока действия — 30 дней от текущего времени, путь на сервере /, домен .example.com, и устанавливаем флаги secure, httponly и samesite, чтобы cookie передавался только по HTTPS, не был доступен через клиентские скрипты и ограничивался запросами с того же сайта соответственно.

Чтение Cookies

Cookies, установленные с помощью setcookie(), автоматически доступны в суперглобальном массиве $_COOKIE при последующих запросах страниц. Вы можете проверить их наличие и прочитать значения следующим образом:

if (isset($_COOKIE['username'])) {
    echo "Welcome, " . htmlspecialchars($_COOKIE['username']);
}

Удаление Cookies

Чтобы удалить cookie, нужно установить время его истечения в прошедшую временную метку. Значение можно оставить пустым.

setcookie('username', '', [
    'expires' => time() - 3600,
    'path'    => '/',
]);

Убедитесь, что pathdomain, если он был указан) совпадают со значениями, использованными при создании cookie. Cookie, установленный с path => '/admin', не будет удалён вызовом с path => '/', так как браузер считает их разными cookies.

Важные замечания

  • Возвращаемое значение: setcookie() возвращает true при успехе и false при неудаче (в том числе, когда заголовки уже отправлены).
  • Заголовки уже отправлены: Cookies должны устанавливаться до отправки любого вывода в браузер (включая HTML, пробелы перед <?php или echo). В противном случае PHP выдаст предупреждение «Headers already sent». Используйте headers_sent() для обнаружения этой ситуации.
  • Автоматическое кодирование: setcookie() автоматически URL-кодирует значения cookies, поэтому ручное кодирование обычно не требуется. Если вам нужно сохранить значение без кодирования, используйте вместо этого setrawcookie().
  • Ограничения размера: Браузеры ограничивают каждый cookie примерно 4 КБ и ограничивают количество cookies для одного домена, поэтому cookies предназначены для небольших значений, а не для объёмных данных.

Cookies против Сессий

Cookies хранятся в браузере и отправляются с каждым запросом, поэтому всё, что вы в них сохраняете, видно пользователю (и может быть им изменено). Для конфиденциальных данных храните в cookie только идентификатор, а реальные данные держите на сервере с помощью сессий PHP. Общий обзор работы с cookies в PHP см. в главе PHP Cookies.

Заключение

Функция setcookie() — это полезный инструмент для установки cookies в PHP-приложениях. Понимая современный синтаксис на основе массивов, необходимость вызова до любого вывода и совпадение path/domain при удалении, вы сможете надёжно управлять данными на стороне клиента — и знать, когда лучше воспользоваться сессиями.

Практика

Практика
Какие факторы могут влиять на функцию setcookie в PHP?
Какие факторы могут влиять на функцию setcookie в PHP?
Was this page helpful?