将Cookie设置为永不过期


187

查看有关设置cookiephp文档,我看到可以设置cookie的失效日期。您可以将cookie设置为在浏览器会话结束时或将来的某个时间过期,但是我看不到将cookie设置为永不过期的方法。这有可能吗?如何实现?


13
@sAc:为什么这是一件坏事?
brainimus

1
因为按照cookie规范,无论如何这是不可能的。不能将其设置为永不过期。
Sarfraz

2
您可以使用$cookie->setMaxAge(2147483647);,这是晚于2080和工作在32位和64位,与github.com/delight-im/PHP-Cookie
CAW

Answers:


259

所有cookie均按照cookie规范过期,因此这不是PHP的限制。

使用较远的日期。例如,设置一个十年内到期的cookie:

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

请注意,如果您在32位PHP中设置了2038年以后的日期,则该数字会四舍五入,并且您会获得一个cookie,该cookie立即失效。


8
同意!而且我认为,在20年内,网站将遥遥领先,可能不会使用Cookie。.@brainimus:只需使用大家提到的oldschool系统-当前时间+未来时间!
震动

13
请注意,当2018年到来时,如果我们不使用64位PHP,它将环绕32位整数并在接近零的时间内发送到客户端。(对于PHP上的25年cookie,目前正在发生这种情况。)
2013年

83
很高兴能在2018年回到这些评论(距离现在只有5年),看到每个人都争先恐后地实施Y2018升级,然后20年后的2038年再次实现。希望到那时,我们所有人都可以跳到64位在12月4日(星期日)的另外2,920亿年内,这不会成为问题292,277,026,596。除非我们在死前达成单一性,否则我不必担心这一点。
shaunhusain

58
如果某人在2037年底使用的是现在使用的同一台计算机,那将是可悲的!
阿贝拉

22
我在2018年阅读这篇文章,惊慌了一下,然后意识到我还可以。
闯入者

80

最大值:2147483647

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

为避免整数溢出,时间戳记应设置为:

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

设置较高的值可能会导致旧版浏览器出现问题。

另请参阅有关cookieRFC

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年龄

如果缓存收到的值大于它可以表示的最大正整数,或者如果任何年龄计算溢出,则它必须发送一个2147483648(2 ^ 31)值的Age标头。

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


39

设定未来的绝对时间

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

与接受的答案中建议的相对于当前时间的绝对时间相比,使用绝对时间更好。

与32位系统兼容的最大值是:

2147483647 = 2^31 = ~year 2038

22
20亿个很容易记住,但永远$的理想数字将是2 ^ 31-1 = 2147483647,对应于2038年1月。这是避免2038 bug整数溢出的最大值,如@John所说。
David

13

我的特权使我无法对第一篇文章发表评论,因此必须在此处进行评论。

应该考虑2038 Unix错误从当前日期提前20年设置时,建议将其作为上述正确答案。

根据您最终运行的浏览器和/或版本,2018年1月19日+(20年)的cookie可能会遇到2038问题。


7

您是否只能说一个永无止境的循环,Cookie会在当前日期+ 1之前到期,所以它永远不会达到它应该到期的日期,因为它始终是明天?有点矫kill过正,只是在说。


1
实际上,他有一点。仅使用一些适当的“不活动时间”(例如3个月),然后在每次请求时使用该时间刷新cookie确实有意义。
Stijn de Witt 2014年

@StijndeWitt或仅仅10年。如果用户在10年内访问过,请对其进行更新...
Jez

5

尽管这不可能完全实现,但是您可以执行类似于Google的操作,并将Cookie设置为2038年1月17日过期,或者相距很远。

实际上,您最好将Cookie设置为10年或60 * 60 * 24 * 365 * 10,这将使您的Cookie可以使用的大多数计算机的寿命都超过了。


2
这将一直持续到2028年初,届时您将溢出该值,并且cookie将停止工作。最好改用绝对值。
davidjbullock 2014年

1
假设他的代码在2028年仍将在过时的机器上运行...某种程度上,我更担心每个人都将忘记更新固定日期...软件倾向于使硬件失效。
Stijn de Witt 2014年


1

永远不要永远都是两个字,我避免使用由于世事难料。

1 January 1970可以使用带符号32-bit整数存储的最晚时间是03:14:07 on Tuesday, 19 January 2038231-1 = 2,147,483,647之后的秒1 January 1970。此限制称为2038年问题

setCookie("name", "value", strtotime("2038-01-19 03:14:07"));

0

我相信没有办法让cookie永远持续下去,但是您只需要将其设置为在2100年之前就过期即可。


0

您不应该这样做,而且这也是不可能的,如果您愿意,可以设置更大的值,例如提前10年。

顺便说一句,我从未见过有这样要求的cookie :)


我假设用于唯一回答的民意测验的cookie不想过多地避免阻止多个条目具有此要求。
随机大象

看看@sarfraz,它的计算机cookie不是您吃的那些。
腹板

-1

我不确定,但是浏览器关闭时cookie是否不会删除?我以某种方式使cookie和chrome永不过期,将过期日期识别为“在浏览器关闭时” ...


4
不一定,如果您在Cookie上设置了失效日期,则在关闭浏览器并重新打开后,该失效日期将继续存在。如果未设置到期时间,则关闭浏览器时将删除默认行为。
2011年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.