Установить cookie, чтобы никогда не истек

187

Глядя на документацию php по настройке cookie, я вижу, что я могу установить дату истечения срока действия cookie. Вы можете установить срок действия файла cookie в конце сеанса браузера или в будущем, но я не вижу способа настроить файл cookie так, чтобы он никогда не истек. Возможно ли это вообще и как это сделать?

brainimus
источник
13
@sAc: Почему это плохо?
brainimus
1
Потому что это невозможно в любом случае в соответствии со спецификацией cookie. Это не может быть установлено, чтобы никогда не истек.
Сарфраз
2
Вы можете использовать $cookie->setMaxAge(2147483647);позже 2080 года и работать как на 32-битной, так и на 64-битной версии
caw

Ответы:

261

Срок действия всех файлов cookie истекает согласно спецификации файлов cookie , поэтому это не ограничение PHP.

Используйте далекую будущую дату. Например, установите cookie, срок действия которого истекает через десять лет:

setcookie(
  "CookieName",
  "CookieValue",
  time() + (10 * 365 * 24 * 60 * 60)
);

Обратите внимание, что если вы установите дату после 2038 года в 32-битном PHP, число будет изменено, и вы получите файл cookie, который истекает мгновенно.

Джори Хендрикс
источник
8
Согласовано! И я думаю, что через 20 лет веб-сайты будут далеко впереди, и, возможно, файлы cookie не будут использоваться. @Brainimus: Просто используйте все упомянутые системы oldschool - текущее время + время в далеком будущем!
Толчок
13
Помните, что когда наступит 2018 год, если мы не будем использовать 64-битный PHP, это обернется вокруг 32-битного целого числа и будет отправлено клиенту как время, близкое к нулю. (Это происходит прямо сейчас для 25-летних файлов cookie на PHP.)
Riking
83
Будет забавно вернуться к этим комментариям в 2018 году (всего через 5 лет) и увидеть, как все изо всех сил пытаются внедрить обновление Y2018, а затем 20 лет спустя, в 2038 году. Надеемся, что к тому времени мы все сделаем прыжок на 64-битные все не будет проблемой в течение еще 292 миллиардов лет в воскресенье, 4 декабря, 292,277,026,596. Пока мы не достигнем сингулярности до моей смерти, я не думаю, что мне придется беспокоиться об этом.
Shaunhusain
58
Если человек использует тот же компьютер в конце 2037 года, который он использует сейчас ... это было бы просто печально!
Абела
23
Я читаю это в 2018 году, на мгновение запаниковала, потом поняла, что со мной все в порядке.
The Interloper
80

Максимальное значение: 2147483647

setcookie("CookieName", "CookieValue", 2147483647);

Чтобы избежать целочисленного переполнения, отметка времени должна быть установлена ​​на:

2^31 - 1 = 2147483647 = 2038-01-19 04:14:07

Установка более высокого значения может вызвать проблемы со старыми браузерами.

Также смотрите RFC о куки :

Max-Age=value
  OPTIONAL.  The value of the Max-Age attribute is delta-seconds,
  the lifetime of the cookie in seconds, a decimal non-negative
  integer.  To handle cached cookies correctly, a client SHOULD
  calculate the age of the cookie according to the age calculation
  rules in the HTTP/1.1 specification [RFC2616].  When the age is
  greater than delta-seconds seconds, the client SHOULD discard the
  cookie.  A value of zero means the cookie SHOULD be discarded
  immediately.

и RFC 2616, 14,6 лет :

Если кэш получает значение, большее, чем наибольшее положительное целое число, которое он может представить, или если любое из его вычислений возраста переполняется, он ДОЛЖЕН передать заголовок Age со значением 2147483648 (2 ^ 31).

http://www.faqs.org/rfcs/rfc2616.html

PiTheNumber
источник
39

Установите абсолютное время далекого будущего :

setcookie("CookieName", "CookieValue", 2147483647);

Лучше использовать абсолютное время, чем рассчитывать его относительно настоящего, как рекомендуется в принятом ответе.

Максимальное значение, совместимое с 32-битными системами:

2147483647 = 2^31 = ~year 2038
Дэвид
источник
23
2 миллиарда легко запомнить, но идеальное число для $ forever будет равно 2 ^ 31 - 1 = 2147483647, что соответствует январю 2038 года. Это максимальное значение, чтобы избежать целочисленного переполнения ошибки 2038, как сказал @John.
Дэвид
13

Моя привилегия не позволяет мне комментировать первый пост, поэтому он должен будет перейти сюда.

При настройке на 20 лет заблаговременно от текущей даты следует принимать во внимание ошибку Unix 2038, которая является правильным ответом выше.

Ваш файл cookie от 19 января 2018 года (20 лет) вполне может столкнуться с проблемой 2038 года в зависимости от браузера и / или версий, на которых вы работаете.

Джон
источник
7

Разве вы не можете просто сказать бесконечный цикл, cookie истекает как текущая дата + 1, поэтому он никогда не достигает даты, на которую он должен истечь, потому что это всегда завтра? Немного излишне, но просто говорю.

Иисус
источник
1
На самом деле, у него есть точка. Использование некоторого подходящего «периода бездействия», скажем, 3 месяца, а затем обновление cookie с этим периодом в каждом запросе имеет смысл.
Стейн де Витт
@StijndeWitt Или всего 10 лет. Затем обновите его, если пользователь посещает в течение 10 лет ...
Jez
5

Хотя это не совсем возможно, вы можете сделать что-то похожее на то, что делает Google, и установить срок действия ваших файлов cookie до 17 января 2038 года или что-то такое же далекое.

В целом, вам может быть лучше установить cookie на 10 лет или 60 * 60 * 24 * 365 * 10, что должно пережить большинство машин, на которых будет работать ваш cookie.

h3r2on
источник
2
Это будет работать до начала 2028 года, после чего вы переполните значение, и куки перестанут работать. Вместо этого лучше использовать абсолютное значение.
Давиджуллок
1
Предполагая, что его код все еще будет работать на устаревших машинах в 2028 году ... Почему-то я больше беспокоюсь, что все забудут обновить фиксированную дату ... Программное обеспечение, как правило, переживает аппаратное обеспечение.
Стейн де Витт,
4

Если вы хотите сохранить данные на клиентском компьютере постоянно - или хотя бы до полного опустошения кэша браузера, используйте локальное хранилище Javascript:

https://developer.mozilla.org/en-US/docs/DOM/Storage#localStorage

Не используйте хранилище сеансов, так как оно будет очищено, как cookie с максимальным возрастом ноль.

Бьерн
источник
Не могу рассмотреть localStorage, когда речь идет о чтении данных на стороне сервера.
WhiteHorse
1

Никогда и навсегда два слова, которые я избегаю использовать из-за непредсказуемости жизни.

Самое позднее время, 1 January 1970которое может быть сохранено с использованием целого 32-bitчисла со знаком, - 03:14:07 on Tuesday, 19 January 2038( 231-1 = 2,147,483,647секунды после 1 January 1970) . Это ограничение известно как проблема 2038 года

setCookie("name", "value", strtotime("2038-01-19 03:14:07"));
CONvid19
источник
0

Я считаю, что не существует способа сделать cookie-файл вечным, но вам просто нужно настроить его на срок действия в будущем, например, 2100 год.

Джоэл Кеннеди
источник
0

Вы не должны этого делать, и это все равно невозможно. Если вы хотите, вы можете установить большее значение, например, на 10 лет вперед.

Кстати, я никогда не видел куки с таким требованием :)

Sarfraz
источник
Я бы предположил, что файлы cookie используются для опросов с уникальным ответом, которые не хотят слишком беспокоиться о том, что множественные записи не имеют этого требования.
Случайный Слон
посмотрите @sarfraz, это компьютерные куки, а не те, которые вы едите.
перемычками
-1

Я не уверен, но куки не удаляются при закрытии браузера? Я каким-то образом сделал никогда не истекающий cookie и Chrome распознал дату истечения срока действия как "при закрытии браузера" ...

bluewhile
источник
4
Необязательно, если вы установите дату истечения срока действия cookie, он сохранится после того, как вы закроете браузер и снова откроете его. Если вы не установите срок действия, поведение по умолчанию будет удалено при закрытии браузера.
HoLyVieR
-2

Вы не можете, но что, если вы установите срок истечения сейчас + 100 лет?

Борис Делормас
источник
3
Нет, потому что это превысит максимальное значение в январе 2038 года.
davidjbullock