Функция 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' => '/',
]);Убедитесь, что path (и domain, если он был указан) совпадают со значениями, использованными при создании 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 при удалении, вы сможете надёжно управлять данными на стороне клиента — и знать, когда лучше воспользоваться сессиями.