Способы удалить cookie средствами PHP

Раздел: Операции с данными -> Управление cookie

Удаление cookie в PHP

Основной и наиболее эффективный способ удаления cookie в PHP

Для удаления cookie используется функция setcookie() с установкой времени жизни в прошлом. Браузер, получив такой ответ, удалит соответствующую куку. Рекомендуется также указывать путь, чтобы гарантированно перезаписать исходную куку.

setcookie('username', '', time() - 3600, '/');

Php удалить cookie (php удалить cookie)

В этом примере кука с именем username удаляется путём установки пустого значения и времени истечения на один час раньше текущего момента. Параметр '/' означает, что кука доступна на всех страницах сайта – это необходимо, если исходная кука была установлена с этим путём.

С PHP 7.3+ можно использовать синтаксис с массивом опций:

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

Этот способ более читаем и позволяет легко задать дополнительные параметры (домен, secure, httponly, samesite).

Каким образом удалить cookie без указания пути?

Если при создании куки не был указан путь, достаточно вызвать setcookie() без указания пути или с путём по умолчанию:

setcookie('theme', '', time() - 3600);

Однако если браузер сохранил куку с другим путём (например, /admin), то такой вызов не удалит её. Поэтому всегда лучше указывать точный путь, с которым была создана кука.

Типичная ошибка:

Кука не удаляется, если время жизни установлено в будущее, а не в прошлое. Проверьте, что передано именно отрицательное смещение от time().

Как удалить cookie и сразу обновить переменную $_COOKIE?

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

unset($_COOKIE['username']);
setcookie('username', '', time() - 3600, '/');

Теперь при следующем обращении к $_COOKIE['username'] в том же запросе будет выдана ошибка (или null), а браузер получит команду удалить куку.

Проблема:

Если не вызвать unset(), то до конца выполнения скрипта $_COOKIE будет содержать старое значение, что может привести к логическим ошибкам. Решение – всегда добавлять unset после вызова setcookie() для удаления.

Как удалить все cookie текущего домена?

Перебор всех элементов $_COOKIE и вызов setcookie() для каждого с истекшим временем. Важно указывать путь /, чтобы охватить все возможные пути.

foreach ($_COOKIE as $name => $value) {
    setcookie($name, '', time() - 3600, '/');
}

Этот код удалит все куки, видимые в текущем контексте. Если куки были установлены для поддоменов или с другим путём, они не будут затронуты.

Ошибка:

При удалении всех кук можно случайно затронуть и cookie сессии, если используются файловые сессии. Чтобы избежать этого, лучше исключать имя сессионной куки (обычно PHPSESSID).

Как удалить cookie с определённым доменом или путём?

Чтобы удалить куку, созданную для конкретного поддомена или пути, необходимо передать те же параметры domain, path (и при необходимости secure, httponly), что и при её создании:

setcookie('user', '', time() - 3600, '/admin', '.example.com');

Здесь удаляется кука с именем user, установленная для пути /admin на домене .example.com (включая поддомены).

Частая проблема:

Если параметры не совпадают (например, путь указан как /, а кука была создана с путём /admin), браузер проигнорирует команду удаления. Решение – всегда хранить параметры создания куки или использовать единый корневой путь.

Как удалить cookie через заголовок Set-Cookie вручную?

Вместо setcookie() можно напрямую отправить HTTP-заголовок с помощью header(). Этот способ полезен при низкоуровневой работе с ответами или когда нужно явно контролировать формат заголовка.

header('Set-Cookie: user=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=.example.com; secure; httponly; samesite=Lax');

В этом примере устанавливаются все необходимые атрибуты: пустое значение, дата истечения в прошлом, путь, домен, флаги безопасности. Обратите внимание, что перед вызовом header() не должно быть вывода данных (включая пробелы).

Ошибки:

Неправильный формат даты (не GMT) или лишние пробелы могут привести к игнорированию заголовка браузером. Рекомендуется использовать gmdate() для формирования корректной даты.

Расширенные примеры удаления cookie в PHP

Пример 1: Удаление cookie с проверкой существования и логированием

Пример
function deleteCookie(string $name, string $path = '/', string $domain = null, bool $secure = false, bool $httponly = false, string $samesite = 'Lax'): bool {
    if (!isset($_COOKIE[$name])) {
        return false; // кука не существует, нечего удалять
    }
    $options = [
        'expires' => time() - 86400,
        'path' => $path,
    ];
    if ($domain !== null) $options['domain'] = $domain;
    if ($secure) $options['secure'] = true;
    if ($httponly) $options['httponly'] = true;
    $options['samesite'] = $samesite;

    $result = setcookie($name, '', $options);
    if ($result) {
        unset($_COOKIE[$name]);
        error_log("Cookie '$name' deleted successfully.");
    }
    return $result;
}

// Использование
deleteCookie('session_id', '/', '.example.com', true, true, 'Strict');
Результат: кука session_id удалена (если существовала). В лог записано сообщение об успешном удалении.

Пример 2: Удаление всех cookie, кроме сессионной

Пример
$sessionName = session_name(); // обычно 'PHPSESSID'
foreach ($_COOKIE as $name => $value) {
    if ($name !== $sessionName) {
        setcookie($name, '', time() - 3600, '/');
        unset($_COOKIE[$name]);
    }
}
Все куки, кроме идентификатора сессии, удалены. $_COOKIE теперь содержит только сессионную куку (если сессия активна).

Пример 3: Удаление cookie с учётом SameSite и Secure (PHP 7.3+)

Пример
setcookie('api_token', '', [
    'expires' => time() - 3600,
    'path' => '/api',
    'domain' => 'api.example.com',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'None',
]);
unset($_COOKIE['api_token']);
Кука api_token с атрибутами SameSite=None (требуется для кросс-доменных запросов) и Secure удалена.

Пример 4: Пакетное удаление cookie массива (cookies с префиксом)

Пример
$prefix = 'site_';
foreach ($_COOKIE as $name => $value) {
    if (strpos($name, $prefix) === 0) {
        setcookie($name, '', time() - 3600, '/');
        unset($_COOKIE[$name]);
    }
}
Удалены все куки, имена которых начинаются с 'site_' (например, site_theme, site_lang).

Пример 5: Вывод состояния до и после удаления

Пример
echo "До удаления:";
print_r($_COOKIE);

// Удаляем одну куку
setcookie('test', '', time() - 3600, '/');
unset($_COOKIE['test']);

echo "После удаления:";
print_r($_COOKIE);
До удаления: Array ( [test] => value [other] => data )
После удаления: Array ( [other] => data )

php удалить cookie - comments

En
Php удалить cookie (php)