Setcookie: примеры (PHP)

Полное руководство по установке cookie в PHP с помощью setcookie
Раздел: HTTP
setcookie(string name [, string value [, int expires [, string path [, string domain [, bool secure [, bool httponly]]]]]]): bool
Функция setcookie в PHP

Функция setcookie() определяет cookie, которое будет отправлено браузеру клиента вместе с остальными HTTP-заголовками. Эта функция вызывается до того, как скрипт начнет генерировать вывод. Cookie является частью HTTP-заголовка, поэтому отправка должна происходить до любого вывода данных в тело ответа.

Cookie используются для сохранения небольших данных на стороне клиента между запросами, что позволяет реализовать механизмы сессий, хранения пользовательских предпочтений или данных для отслеживания.

Аргументы функции
  • name (обязательный): Имя cookie.
  • value (опциональный): Значение cookie. Если задано как пустая строка или null, cookie будет удалено браузером.
  • expires_or_options (опциональный): Время жизни cookie. Может быть передано как целое число (timestamp Unix) или как массив с опциями (начиная с PHP 7.3.0). Если параметр равен 0 или опущен, cookie станет сессионным и удалится после закрытия браузера.
  • path (опциональный): Путь на сервере, в пределах которого cookie будет доступно. Если задан '/', cookie будет доступно для всего домена.
  • domain (опциональный): Домен, для которого cookie будет доступно. Чтобы cookie было доступно на всех поддоменах, указывается основной домен, например, '.example.com'.
  • secure (опциональный): Если true, cookie будет передаваться только по защищенному протоколу HTTPS.
  • httponly (опциональный): Если true, cookie будет доступно только через HTTP-протокол и не будет доступно скриптовым языкам (например, JavaScript). Это помогает снизить риск атак XSS.
  • samesite (опциональный): Может содержать значения 'Strict', 'Lax' или 'None'. Ограничивает отправку cookie между сайтами для защиты от CSRF-атак. Для значения 'None' требуется атрибут secure=true.
Примеры использования setcookie
Простая установка cookie
<?php
// Установка сессионного cookie с именем 'user' и значением 'John'
setcookie('user', 'John');
?>
Cookie 'user' со значением 'John' отправлено браузеру. Удалится после закрытия браузера.
Cookie с временем жизни
<?php
// Cookie будет жить 1 час (3600 секунд)
setcookie('token', 'abc123', time() + 3600);
?>
Cookie 'token' установлено на 1 час.
Использование массива опций (PHP 7.3+)
<?php
setcookie('pref', 'dark', [
    'expires' => time() + 86400,
    'path' => '/',
    'domain' => '.site.com',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Lax'
]);
?>
Безопасное cookie с заданными опциями отправлено клиенту.
Удаление cookie
<?php
// Удаление cookie путем установки времени жизни в прошлое
setcookie('user', '', time() - 3600);
?>
Браузер получит инструкцию удалить cookie 'user'.
Похожие функции в PHP
  • setrawcookie(): Функция аналогична setcookie(), но значение cookie не будет автоматически закодировано в URL-формат. Это полезно, если нужно сохранить значение, уже отформатированное определенным образом.
  • session_set_cookie_params(): Устанавливает параметры для сессионных cookie (например, lifetime, path, domain, secure, httponly, samesite). Параметры применяются к cookie с идентификатором сессии.
  • headers_sent(): Перед вызовом setcookie() рекомендуется проверять, не были ли уже отправлены заголовки. Если вывод уже начался, установка нового cookie не будет возможна.

setcookie() используется для явной установки пользовательских cookie. setrawcookie() применяется реже, когда нужно избежать urlencode. Управление сессионными cookie через session_set_cookie_params() предпочтительнее для настроек сессий.

Типичные ошибки
Вывод перед установкой cookie
<?php
echo "Текст";
// Попытка установить cookie после вывода приведет к ошибке
setcookie('test', 'value');
?>
Warning: Cannot modify header information - headers already sent
Некорректное время жизни
<?php
// Если время указано как строка, cookie может не установиться
setcookie('cookie', 'val', '3600');
?>
Cookie может не установиться, так как ожидается integer timestamp.
Использование SameSite=None без Secure
<?php
// В современных браузерах это может быть проигнорировано
setcookie('cross', 'data', ['samesite' => 'None']);
?>
Cookie может быть отклонено браузером. Для 'SameSite=None' необходим 'secure => true'.
Изменения в последних версиях PHP
  • PHP 7.3.0: Добавлена возможность передавать параметры в виде массива в аргументе expires_or_options. Это сделало синтаксис более читаемым и позволило легко добавлять новые параметры, такие как 'samesite'.
  • PHP 5.5.0: Добавлен параметр httponly.
  • Поддержка SameSite: Явная поддержка параметра samesite в массиве опций появилась в PHP 7.3.0. В более ранних версиях требовалась ручная установка через header().
Расширенные примеры
Массив в cookie (JSON)
Пример php
<?php
$userData = ['name' => 'Alice', 'visits' => 5];
setcookie('user_data', json_encode($userData), time() + 3600, '/', '', false, true);
?>
Сложные данные сериализуются в строку JSON и сохраняются в cookie.
Безопасная установка с валидацией
Пример php
<?php
if (!headers_sent() && isset($_POST['theme'])) {
    $theme = htmlspecialchars($_POST['theme']);
    setcookie('site_theme', $theme, [
        'expires' => time() + 86400 * 30,
        'httponly' => true,
        'samesite' => 'Strict'
    ]);
}
?>
Cookie устанавливается только если заголовки не отправлены, значение обрабатывается для безопасности.
Использование в классе для работы с настройками
Пример php
<?php
class CookieManager {
    public static function set($name, $value, $days = 30) {
        $options = [
            'expires' => time() + 86400 * $days,
            'path' => '/',
            'httponly' => true,
            'samesite' => 'Lax'
        ];
        if (isset($_SERVER['HTTPS'])) {
            $options['secure'] = true;
        }
        return setcookie($name, $value, $options);
    }
}
CookieManager::set('language', 'ru', 7);
?>
Упрощенное и централизованное управление cookie с автоматической настройкой secure.
Cookie для разных поддоменов
Пример php
<?php
// Cookie будет доступно для всех поддоменов example.com
setcookie('global_session', 'id123', time() + 3600, '/', '.example.com', true, true);
?>
Cookie может быть прочитано скриптами на shop.example.com и blog.example.com.
Альтернативы в других языках

Setcookie в Javascript

Установка через свойство document.cookie. Параметры задаются строкой.

document.cookie = "username=John; max-age=3600; path=/; secure; samesite=Strict";
Cookie установлено в браузере.
Python (Flask)

Использование метода set_cookie объекта ответа.

from flask import make_response
resp = make_response('Hello')
resp.set_cookie('key', 'value', max_age=60*60, secure=True, httponly=True, samesite='Lax')
Cookie отправляется с HTTP-ответом.

Setcookie в MySQL

Прямого аналога для установки cookie на клиенте нет. Cookie - это концепция протокола HTTP, а не базы данных. Однако в MySQL можно хранить сессионные данные или токены, которые потом отправляются через PHP.

PHP setcookie function comments

En
Setcookie Set a cookie