设置cookie永不过期

bra*_*mus 177 php cookies

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

Joe*_*ckx 245

所有cookie都根据cookie规范到期,因此这不是PHP限制.

使用远期日期.例如,设置一个在十年后到期的cookie:

setcookie(
  "CookieName",
  "CookieValue",
  time() + (10 * 365 * 24 * 60 * 60)
);
Run Code Online (Sandbox Code Playgroud)

请注意,如果您在PHP中设置了一个超过2038的日期,那么该数字将会回滚,您将获得一个即时过期的cookie.

  • 在2018年(现在仅仅5年之后)回到这些评论会很有趣,并且看到每个人都争相在20年后的2038年再次实施Y2018升级.希望我们都能跳到64位一切然后这个在星期日,12月4日292,277,026,596,将不再是2920亿年的问题.除非我们在死之前达到一个奇点,否则我不认为我会担心那个. (75认同)
  • 如果一个人在2037年底使用同一台计算机,他们现在正在使用...那只会很难过! (55认同)
  • 我在2018年读到这个,惊慌了片刻,然后意识到我没事. (19认同)
  • 请注意,当2018出现时,如果我们不使用64位PHP,那么这将包围32位整数并在零时附近发送到客户端.(现在正在PHP上发布25年的cookie.) (13认同)
  • 同意!而且我认为,在20年内,网站将遥遥领先,可能不会使用任何cookie.@ brainimus:只需使用所有人提到的oldschool系统 - 当前时间+远期的时间! (7认同)
  • 明天它将是2019年,我在我的网站上实施饼干而不是在庆祝活动中吃一些饼干. (5认同)
  • 2947 年,我从我的 Neurolink 上读到了这篇文章。我们仍然使用 cookie,但它们现在被称为 numnums。 (5认同)
  • 我来自 2022 年,世界仍在使用 cookie;) (4认同)
  • 您始终可以使用原始HTTP标头直接设置到期时间:`header('Set-Cookie:cookie_name = cookie_value; expires = Fri,31-Dec-9999 23:59:59 GMT');`.除非PHP开发人员决定最终使`setcookie`使用64位整数作为时间戳值(64位POSIX时间戳可以用例如`date_create('+ 1000 years') - > format('U')`生成,甚至在32位PHP上),在我们的应用程序中编写自定义setcookie函数可能取决于我们自己. (3认同)
  • @shaunhusain你好未来.到2018年再过一年...我想大多数人现在使用64位PHP .... (2认同)
  • @Tschallacka感谢您的更新,是的,我认为当时大多数开发人员都在使用64位硬件,但不确定实际操作系统和软件包的分布最广(或者当前的统计数据),但似乎避免了灾难. ....现在(老实说有点令人惊讶的是PHP已经设法生存并发展到这一点). (2认同)
  • 大家好,我是从2019年开始一直在与您交谈。我们的星球发生了很大变化。我们正在寻找宇宙中的地方来拯救我们的物种。同时,我们仍然使用cookie。 (2认同)

PiT*_*ber 69

最大值:2147483647

setcookie("CookieName", "CookieValue", 2147483647);
Run Code Online (Sandbox Code Playgroud)

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

2^31 - 1 = 2147483647 = 2038-01-19 04:14:07
Run Code Online (Sandbox Code Playgroud)

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

另请参阅有关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.
Run Code Online (Sandbox Code Playgroud)

RFC 2616,14.6年龄:

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

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


Dav*_*vid 35

设定一个遥远的未来绝对时间:

setcookie("CookieName", "CookieValue", 2147483647);
Run Code Online (Sandbox Code Playgroud)

最好使用绝对时间,而不是按照接受的答案中的建议计算相对于现在的时间.

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

2147483647 = 2^31 = ~year 2038
Run Code Online (Sandbox Code Playgroud)

  • 2亿美元很容易记住,但$ forever永远的理想数字是2 ^ 31-1 = 2147483647对应于2038年1月.这是避免2038错误整数溢出的最大值,如@John所说. (22认同)

Joh*_*ohn 13

我的特权阻止我在第一篇文章上发表评论,所以它必须要到这里.

从当前日期开始提前20年设置时,应考虑2038 unix bug,这是上述正确答案.

你的cookie在2018年1月19日+(20年)可能会遇到2038问题,具体取决于你最终运行的浏览器和/或版本.


小智 7

难道你不能说一个永无止境的循环,cookie到期为当前日期+ 1所以它永远不会达到它应该到期的日期,因为它总是明天?有点矫枉过正,但只是说.

  • 给出一个适合"耶稣会做什么!"的答案+1 ;) (12认同)

h3r*_*2on 6

虽然这不太可能,你可以做类似于谷歌的事情,并将你的cookie设置为在2038年1月17日到期之前到期.

实际上,你可能最好将你的cookie设置为10年或60*60*24*365*10,这应该比你的cookie所使用的大多数机器都要长.

  • 这将一直持续到2028年初,届时你将溢出价值,cookie将停止工作.最好使用绝对值. (2认同)

JCo*_*ier 6

每当此处的链接发布时,Chrome cookie 最多可以保存 400 天。Chrome 在做出此响应时非常重要,因此我会将 cookie 的过期时间设置为 400 天或更短。

如果您不想点击该链接,它总结如下:

当 cookie 设置为明确的 Expires/Max-Age 属性时,该值现在将被限制为未来不超过 400 天。以前,没有限制,cookie 可能会在未来几千年过期。