代码之家  ›  专栏  ›  技术社区  ›  brainimus user417509

将cookie设置为永不过期

  •  166
  • brainimus user417509  · 技术社区  · 16 年前

    看着 php documentation on setting a cookie 我知道我可以为cookie设置一个到期日期。您可以将cookie设置为在浏览器会话结束时或将来某个时间过期,但我看不到将cookie设置为永不过期的方法。这是可能的吗?这是如何实现的?

    11 回复  |  直到 8 年前
        1
  •  233
  •   Dave Jarvis James Eichele    13 年前

    所有cookie将根据 cookie specification ,所以这不是PHP限制。

    使用一个遥远的未来日期。例如,设置一个10年后过期的cookie:

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

    请注意,如果将日期设置为过去 二千零三十八 在PHP中,这个数字将被环绕,您将得到一个立即过期的cookie。

        2
  •  62
  •   PiTheNumber    12 年前

    最大值:2147483647

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

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

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

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

    也看到 RFC about cookies :

    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

        3
  •  32
  •   HoldOffHunger Lux    8 年前

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

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

    最好使用绝对时间,而不是按照公认答案中建议的相对于当前时间计算。

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

    2147483647 = 2^31 = ~year 2038
    
        4
  •  13
  •   John    14 年前

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

    应考虑 2038 unix bug 当从当前日期提前20年设定时,建议作为上述正确答案。

    2018年1月19日(20年)发布的cookie很可能会遇到2038年的问题,这取决于你最终运行的浏览器和/或版本。

        5
  •  6
  •   h3r2on    16 年前

    虽然这不太可能,但你可以做一些类似于谷歌做的事情,并将你的cookie设置为2038年1月17日到期,或者做一些同样远的事情。

    在所有的实用性中,你最好将你的cookie设置为10年或60*60*24*365*10,这应该比你的cookie所使用的大多数机器都要长寿。

        6
  •  6
  •   xiº Rumpleteaser    10 年前

    难道你不能说一个永无止境的循环,cookie作为当前日期+1过期,所以它永远不会达到它应该到期的日期,因为它总是明天?有点过分了,只是说说而已。

        7
  •  4
  •   j0k gauthamp    13 年前

    如果要永久保存客户端计算机上的数据,或者至少在浏览器缓存完全清空之前,请使用javascript本地存储:

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

    不要使用会话存储,因为它将像最大使用时间为零的cookie一样被清除。

        8
  •  0
  •   Joel Kennedy    16 年前

    我相信没有一种方法可以让一块曲奇永远持续下去,但是你只需要把它设置为在未来很长的时间内到期,比如2100年。

        9
  •  0
  •   Boris Delormas    16 年前

    你不能,但是如果你把过期时间设置为现在+100年呢?

        10
  •  0
  •   Sarfraz    16 年前

    你不应该这样做,无论如何这是不可能的,如果你想的话,你可以设定一个更大的值,比如未来10年。

    顺便说一句,我从来没有见过这么有要求的饼干。

        11
  •  -1
  •   paulgavrikov    14 年前

    我不确定,但浏览器关闭时是否删除cookie?不知怎么的,我做了一个永不过期的cookie和chrome识别过期日期为“在浏览器关闭时”…