Php удалить куки при закрытии браузера
Cookie (куки) представляют небольшие наборы данных (не более 4 кБайт), с помощью которых веб-сайт может сохранить на компьютере пользователя любую информацию. С помощью куки можно отслеживать активность пользователя на сайте: залогинен пользователь на сайте или нет, отслеживать историю его визитов и т.д.
Сохранение cookie
Для установки куки на компьютере пользователя используется функция setcookie() . Она должна вызываться перед тем, как будет отправлен ответ пользователю. Эта функция имеет следующее определение:
Функция setcookie() может принимать следующие параметры:
name : имя cookie, которое будет использоваться для доступа к его значению
value : значение или содержимое cookie - любой алфавитно-цифровой текст не более 4 кБайт
expire (необязательный параметр): срок действия в секундах, после которого cookie уничтожаются. Если данный параметр не установлен или равен 0, то уничтожение cookie происходит после закрытия браузера. Обычно устанавливается относительно текущего времени, которое можно получить с помощью функции time()
path (необязательный параметр): путь к каталогу на сервере, для которого будут доступны cookie. Если задать "/", cookie будут доступны для всего сайта. Если задать, например, "/mydir/" , cookie будут доступны только из каталога /mydir/ и всех его подкаталогов. По умолчанию значением является текущий каталог, в котором устанавливаются cookie.
Здесь устанавливаются две куки: "name" и "age". Первая куки уничтожается после закрытия браузера, а вторая - через 3600 секунд, то есть через час.
При необходимости мы можем увидеть сохраненные куки в браузере с помощью инструментов разработчика. Например, вид куки в Google Chrome:
В cookie можно сохранить любую информацию, но не стоит сохранять важные с точки зрения безопасности данные, например, пароли. А если и сохранять какую-то важную информацию, то следует хранить ее в зашифрованном виде.
Получение cookie
Чтобы получить cookie, можно использовать глобальный ассоциативный массив $_COOKIE , например, $_COOKIE["name"] . Так, получим ранее сохраненные куки:
Сохранение массивов в cookie
Сохранение в куки массивов имеет некоторые особенности. Например, сохраним следующий массив:
Теперь получим его и выведем на страницу:
Удаление cookie
Для удаления cookie достаточно в качестве срока действия указать какое-либо время в прошлом:
Я пытаюсь установить сессионный cookie в JavaScript следующим образом:
Но Chrome не удаляет его, даже если я закрываю браузер и снова запускаю его.
Я проверил в Firefox и Opera, и оба работают как задумано - они удаляют куки сессии при выходе из браузера.
Chrome просто игнорирует правила истечения срока действия?
Я проверил несколько ОС и обнаружил, что cookie-файлы сессии удаляются в Chrome в Windows XP и Ubuntu, но НЕ в Mac OSX Lion.
Это может быть вызвано тем, что для Chrome установлено значение Продолжить с того места, где вы остановились .
Дальнейшее чтение
Google Chrome имеет проблему, если вы неправильно установили и удалили cookie. Это PHP-код. Мысль это даст вам идею.
Установить cookie
Неправильный путь и не сработает (обратите внимание, что PATH отсутствует)
Правильный способ устранения проблемы в Google Chrome
У меня была та же проблема с «document.cookie» в Windows 8.1, единственный способ, которым Chrome удалял cookie, - это закрытие его из диспетчера задач (не очень интересный способ), поэтому я решил управлять файлами cookie из бэкэнда или использовать что-то как "JS-cookie".
У меня была та же проблема с файлом cookie, срок действия которого истек в конце сеанса просмотра.
К сожалению, этого не произошло, поэтому я немного поиграл с настройками браузера.
Оказалось, что корнем проблемы была функция, которая запоминает открытые вкладки при закрытии браузера. (Функция называется «При запуске» - «Продолжить с того места, где я остановился». По крайней мере, в текущей версии Chrome).
Это также происходит с Opera и Firefox.
Пришлось обоим, непроверенным, в расширенных настройках Chrome:
- «Продолжать запуск фоновых приложений, когда Google Chrome закрыт»
- «Продолжить с того места, где я остановился», «При запуске»
У меня только что была эта проблема. Я заметил, что даже после закрытия браузера у меня запущено много процессов Chrome. Оказывается, это были все из моего расширения Chrome.
В расширенных настройках я снял флажок 'Continue running background apps when Google Chrome is closed' , и мои сеансовые куки-файлы начали работать как надо.
Все еще боль в тылу для всех нас, разработчиков, которые кодировали, ожидая, что сессионные куки-файлы будут очищены, когда пользователь закончит просмотр.
У меня была проблема с сохранением идентификатора сессии в Chrome, но мне не нравится идея отключить опцию продолжения с того места, где я остановился. Я посмотрел файлы cookie для веб-сайта и нашел файл cookie идентификатора сессии для страницы входа. Удаление, которое не исправило мою проблему. Я ищу домен и обнаружил, что в домене есть еще один файл cookie с идентификатором сессии. Удаление обоих файлов cookie идентификатора сеанса вручную устранило проблему, и я не закрыл и не открыл браузер, который мог восстановить файлы cookie.
Если вы установите домен для cookie-файла php, браузеры, кажется, будут удерживать его в течение 30 секунд или около того. Кажется, не имеет значения, закрываете ли вы вкладку или окно браузера.
Поэтому, если вы управляете сеансами, используя что-то вроде следующего, это может привести к зависанию куки в браузере дольше, чем ожидалось.
Единственный способ избавиться от зависшего cookie-файла - удалить строку кода, которая устанавливает домен cookie-файла сеанса. Также следите за функцией session_set_cookie_params (). Точка префикса домена, похоже, не имеет никакого отношения к этой проблеме.
Это может быть ошибка php, так как php отправляет cookie-файл сеанса (т.е. PHPSESSID=b855ed53d007a42a1d0d798d958e42c9 ) в заголовок после того, как сеанс был уничтожен. Или это может быть проблема распространения сервера, но я так не думаю, так как мой тест проводился на частных серверах.
Вы пытались удалить расширение Hangouts в Google Chrome? потому что это заставляет Chrome продолжать работать, даже если вы закроете все окна.
Я тоже столкнулся с проблемой, но теперь она решена.
Работал на меня
Это может быть потому, что Chrome все еще работает в фоновом режиме после закрытия браузера. Попробуйте отключить эту функцию, выполнив следующие действия:
- Открыть Chrome: // Настройки /
- Нажмите «Показать дополнительные настройки . »
- Перейдите в раздел «Система» и отключите «Продолжать запуск фоновых приложений, когда Google Chrome закрыт». Это заставит Chrome полностью закрыться, а затем удалит сессионные куки.
Тем не менее, я думаю, что Chrome должен проверять и удалять файлы cookie предыдущих сессий, начиная с закрытия, а не с закрытия.
Простая альтернатива - использовать новый sessionStorage объект. Согласно комментариям, если вы отметили «продолжить там, где я остановился», sessionStorage будет сохраняться между перезапусками.
Альтернативная сигнатура доступна с PHP 7.3.0 (именованные параметры не поддерживаются):
После передачи клиенту cookie станут доступны через массив $_COOKIE при следующей загрузке страницы. Значения cookie также есть в $_REQUEST .
Список параметров
» RFC 6265 даёт конкретные указания, как нужно интерпретировать каждый из параметров setcookie() . name
Значение cookie. Это значение будет сохранено на клиентском компьютере; не записывайте в cookie секретные данные. Значение, присвоенное cookie c именем name , допустим, 'cookiename' , будет доступно через $_COOKIE['cookiename'] .
Время, когда срок действия cookie истекает. Это метка времени Unix, то есть количество секунд с начала эпохи. Другими словами, желательно задавать это время с помощью функции time() , прибавляя время в секундах, через которое срок действия cookie должен истечь. Либо можно воспользоваться функцией mktime() . time()+60*60*24*30 установит срок действия cookie 30 дней. Если задать 0 или пропустить этот аргумент, срок действия cookie истечёт с окончанием сессии (при закрытии браузера).
Замечание:
Можно заметить, что expires_or_options принимает в качестве значения метку времени Unix, а хранит его в формате Wdy, DD-Mon-YYYY HH:MM:SS GMT . PHP делает это преобразование автоматически.
Путь к директории на сервере, из которой будут доступны cookie. Если задать '/' , cookie будут доступны во всем домене domain . Если задать '/foo/' , cookie будут доступны только из директории /foo/ и всех её поддиректорий (например, /foo/bar/ ) домена domain . По умолчанию значением является текущая директория, в которой cookie устанавливается.
Старые браузеры, следующие устаревшему документу » RFC 2109, могут требовать . перед доменом, чтобы включались все поддомены.
Указывает на то, что значение cookie должно передаваться от клиента по защищённому соединению HTTPS. Если задано true , cookie от клиента будет передано на сервер, только если установлено защищённое соединение. При передаче cookie от сервера клиенту программист веб-сервера должен следить за тем, чтобы cookie этого типа передавались по защищённому каналу (стоит обратить внимание на $_SERVER["HTTPS"] ).
Возвращаемые значения
Если перед вызовом функции клиенту уже передавался какой-либо вывод (теги, пустые строки, пробелы, текст и т.п.), setcookie() потерпит неудачу и вернёт false . Если setcookie() успешно отработает, то вернёт true . Это, однако, не означает, что клиентское приложение (браузер) правильно приняло и обработало cookie.
Список изменений
Версия | Описание |
---|---|
7.3.0 | Добавлена альтернативная подпись, поддерживающая массив опций options . Эта подпись поддерживает также настройку cookie-атрибута SameSite. |
Примеры
Ниже представлено несколько примеров, как отправлять cookie:
setcookie ( "TestCookie" , $value );
setcookie ( "TestCookie" , $value , time ()+ 3600 ); /* срок действия 1 час */
setcookie ( "TestCookie" , $value , time ()+ 3600 , "/~rasmus/" , "example.com" , 1 );
?>
Стоит отметить, что значение cookie перед отправкой клиенту подвергается URL-кодированию. При обратном получении значение cookie декодируется и помещается в переменную, с тем же именем, что и имя cookie. Если вы не хотите, чтобы значения кодировались, используйте функцию setrawcookie() . Посмотреть содержимое наших тестовых cookie можно, запустив один из следующих примеров:
// Вывести одно конкретное значение cookie
echo $_COOKIE [ "TestCookie" ];
// В целях тестирования и отладки может пригодиться вывод всех cookie
print_r ( $_COOKIE );
?>
Чтобы удалить cookie достаточно в качестве срока действия указать какое-либо время в прошлом. Это запустит механизм браузера, удаляющий истёкшие cookie. В примерах ниже показано, как удалить cookie, заданные в предыдущих примерах:
// установка даты истечения срока действия на час назад
setcookie ( "TestCookie" , "" , time () - 3600 );
setcookie ( "TestCookie" , "" , time () - 3600 , "/~rasmus/" , "example.com" , 1 );
?>?php
Имеется возможность помещать в cookie массивы. Для этого каждому cookie нужно дать имя в соответствии с правилами именования массивов. Такая возможность позволяет поместить столько значений, сколько имеется элементов в массиве. При обратном получении все эти значения будут помещены в массив с именем этого cookie:
// отправка cookie
setcookie ( "cookie[three]" , "cookiethree" );
setcookie ( "cookie[two]" , "cookietwo" );
setcookie ( "cookie[one]" , "cookieone" );
// после перезагрузки страницы, выведем cookie
if (isset( $_COOKIE [ 'cookie' ])) foreach ( $_COOKIE [ 'cookie' ] as $name => $value ) $name = htmlspecialchars ( $name );
$value = htmlspecialchars ( $value );
echo " $name : $value
\n" ;
>
>
?>
Результат выполнения данного примера:
Замечание: Использование разделительных символов, таких как [ и ] как часть имени файла cookie, не соответствует RFC 6265, раздел 4, но предполагается, что оно поддерживается пользовательскими агентами в соответствии с RFC 6265, раздел 5.
Примечания
Замечание:
Чтобы иметь возможность отправлять вывод скрипта до вызова этой функции, можно воспользоваться буферизацией. В этом случае весь вывод скрипта помещается в буфер на сервере и остаётся там, пока вы явно не отправите его браузеру. Управление буферизацией осуществляется функциями ob_start() и ob_end_flush() в скрипте, либо можно задать директиву output_buffering в файле php.ini или конфигурационных файлах сервера.
- Cookie станут видимыми только после перезагрузки страницы, для которой они должны быть видны. Для проверки, правильно ли cookie установились, проверьте их при следующей загрузке страницы до истечения срока их действия. Срок действия cookie задаётся в параметре expires_or_options . Удобно проверять существование cookie простым вызовом print_r($_COOKIE); .
- При удалении cookie должны быть заданы те же параметры, что и при установке. Если в качестве значения задать пустую строку, а остальные параметры задать соответственно предыдущему вызову, установившему cookie, тогда cookie c заданным именем будет удалено с клиентской машины. Внутренне это выглядит так: cookie присваивается значение 'deleted' , а срок действия переносится на год в прошлое.
- Так как установка значения false приведёт к удалению cookie, не следует задавать cookie значения булевого типа. Вместо этого можно использовать 0 для false и 1 для true .
- Cookie можно именовать, как массивы, и они будут доступны в PHP-скрипте, как массивы, но на пользовательской машине они будут храниться в виде отдельных записей. Для задания cookie c множеством имён и значений желательно использовать функцию explode() . Не рекомендуется для этих целей использовать функцию serialize() , так как это негативно сказывается на безопасности скрипта.
При многократных вызовах setcookie() функции выполняются в том порядке, в котором вызывались.
I see in my cookie browser from firefox that the cookie still exists. How can I really remove the cookie?
23 Answers 23
You May Try this
@machineaddict unset($_COOKIE['Hello']); is actually important if you might check the cookie somewhere later in the code.
=======DOES NOT WORK IN CHROME======= I tried this code today and when I access the site using google chrome, and then go into developer tools in chrome, I can see that the expire time is set to 1 second before the epoch (e.g. 1969-12-31 23:59:59) however when I next submit the page the cookie is submitted to the server. When I changed the -1 to 1 (e.g. 1970-01-01 00:00:01) to give the following command: setcookie('Hello', null, 1, '/'); then chrome acted as expected and did not submit the cookie
I would definitely not use -1 for the timestamp. Also, because of timezones, I would use a value of at least 86401 so that way you are in Jan 1970 whatever the locale. It should not be important, but for sure -1 is not a good idea.
Set the value to "" and the expiry date to yesterday (or any date in the past)
Then the cookie will expire the next time the page loads.
If you put a date too far in the past, IE will bark and igores it, i.e. the value will not be removed.
@strager The manual states: If set to 0, or omitted, the cookie will expire at the end of the session (when the browser closes). That's not really deleting the cookie. I really don't know if IE will do what Julien said, but it's more than possible that IE will do something strange.
Also, don't forget to actually unset($_COOKIE["hello"]) too, because if there is code on the rest of the page that looks at $_COOKIE["hello"], it will still find it set. I just got bit by this one.
A clean way to delete a cookie is to clear both of $_COOKIE value and browser cookie file :
I keep going down the page and the answers keep getting better, funny. But this is the best one, stop looking here.
FYI, if you set the cookie using a path, you'll need to include the path in this setcookie call as well: setcookie('key', '', time() - 3600, '/');
To reliably delete a cookie it's not enough to set it to expire anytime in the past, as computed by your PHP server. This is because client computers can and often do have times which differ from that of your server.
The best practice is to overwrite the current cookie with a blank cookie which expires one second in the future after the epoch (1 January 1970 00:00:00 UTC), as so:
Correct me if I'm wrong, but setting that to "1" would set it to a second after the epoch, not one second in the future. I believe you're correct about time zone differences though, so the best solution would be to set it to 2 days in the past (so even the furthest away time zone would still unset the cookie).
@PaulSkinner the epoch date is independent of time zones, the computer does that computation for you.
@AlexR Yes. Doesn't really answer my point though. To my understanding, the code above does set the cookie to expire in the past (one second past the epoch), unless I am mistaken.
+1 for the "1". I don't understand why all others are so fixated on setting a deleted cookie exactly one hour in the past.
That will unset the cookie in your code, but since the $_COOKIE variable is refreshed on each request, it'll just come back on the next page request.
To actually get rid of the cookie, set the expiration date in the past:
I had the same problem in my code and found that it was a cookie path issue. Check out this stack overflow post: Can't delete php set cookie
I had set the cookie using a path value of "/", but didn't have any path value when I tried to clear it, so it didn't clear. So here is an example of what worked:
Setting the cookie:
Clearing the cookie:
Hope that helps.
This is how PHP v7 setcookie() code works when you do:
Just set the value of cookie to false in order to unset it:
To delete cookie you just need to set the value to NULL:
"If you've set a cookie with nondefault values for an expiration time, path, or domain, you must provide those same values again when you delete the cookie for the cookie to be deleted properly." Quote from "Learning PHP5" book.
So this code should work(works for me):
Setting the cookie: setcookie('foo', 'bar', time() + 60 * 5);
Deleting the cookie: setcookie('foo', '', time() + 60 * 5);
But i noticed that everybody is setting the expiry date to past, is that necessary, and why?
It is reliable, that's why. A combination of setting the value to nothing and a time in the past (but not too far as IE occasionally doesn't like it too far back from what I've read) works across the board.
If you want to delete the cookie completely from all your current domain then the following code will definitely help you.
This code will delete the cookie variable completely from all your domain i.e; " / " - it denotes that cookie variable's value all set for all domain not just for current domain or path. time() - 300 denotes that it sets to a previous time so it will expire.
Thats how it's perfectly deleted.
Just set the expiration date to one hour ago, if you want to "remove" the cookie, like this:
You should use the filter_input() function for all globals which a visitor can enter/manipulate, like this:
I know that there has been a long time since this topic has been created but I saw a little mistake within this solution (I can call it like that, because it's a detail). I agree that the better solution is probably this solution:
Привет, друзья. Пришло время поговорить о том, что такое PHP cookie, как их установить, удалить, перезаписать и где они используются. Этот урок для начинающих и полных чайников в программировании, поэтому буду показывать на конкретных практических примерах. Итак, что же такое куки в PHP? Это один из способов хранения определенных данных на стороне клиента. Если говорить проще, то куки хранятся в браузере пользователя. Например при авторизации. Когда юзер отправляет данные, они сохраняются на устройстве. Теперь давайте ближе к делу или сразу к видео
Как установить куки в PHP
Все не так сложно, как может показаться. Установка cookie происходит следующим образом:
Это базовые значения, которые обязательны для заполнения. Но параметров гораздо больше, а именно 7! Семь, Карл! И вот для чего каждый из них нужен.
В подавляющем большинстве случаев используются первые 3 параметра чтобы записать cookie в PHP. То есть имя, значение и время жизни. Этого вполне достаточно для полноценной работы. Давайте к практике.
setcookie('name', 5, time()+60)
Здесь я установил cookie name со значением — 5, которая удалится через 1 минуту.
Как получить, прочитать, проверить cookie в PHP
В этом нам поможет глобальный массив COOKIE. Чтобы получить значение куки нам нужно вызвать ее по имени.
Теперь у нас есть условие и его можно использовать в некоторых случаях.
Авторизация с использованием PHP Cookie
Для примера я создам 2 формы. Первая с одним единственным полем, в которое будем писать свое имя. Пока не будет введено и отправлено имя, пользователю будут недоступны некоторые элементы страницы. То есть, если он не авторизован, то какие-то функции сайта от него будут скрыты, а так же показано приветствие. После того, как данные с формы будут отправлены, эта форма будет скрыта и показана другая, которая просто будет запоминать все данные, введенные пользователем.
Теперь осталось в HTML вставить нужные переменные.
setcookie('name', ''); setcookie('name', '$value', time()-86400);
Потом просто выводим на странице переменную count. Протестировать и посмотреть пример работы PHP cookie можно на этой странице:
Время жизни cookie в PHP
Если не указан третий параметр (Expires), то куки будут храниться до окончания сессии, то есть пока вы не закроете браузер. Но можно выставить и другие временные рамки, к примеру на 1 час или на 1 день и т. д. Вот некоторые примеры:
- time()+3600 — один час
- time()+86400 — один день
- time()+86400 * 30 — 30 дней
- time()+86400 * 30 * 12 — 1 год
Этого вполне достаточно, но многие интересуются, как сделать так, чтобы куки жили вечно или сделать время жизни бесконечным. Не очень понимаю в каких случаях это может понадобиться, однако ответ на этот вопрос будет — НЕТ, нельзя. Но можно поставить максимальное время. Пишется так: 0x7FFFFFFF — дата 19.01.2038 года.
Как удалить или очистить (unset) куки в PHP
Удаление куки в PHP можно сделать двумя способами. Оставить значение пустым или установить прошедшую дату, со знаком минус:
setcookie('name', ''); setcookie('name', '$value', time()-86400);
Надеюсь это руководство было максимально понятным и исчерпывающим. Если вам есть что добавить по этой теме или у вас не работают cookie в PHP, то напишите об этом в комментариях, будем разбираться вместе. Так же можете скачать пример из этой статьи и попрактиковаться самостоятельно.
Читайте также: