当过期日期过远时不设置cookie


PHP - cookie is not set when expire date is too far in the future

发现问题,见下文末尾

我有一个php页面,我保存了一个cookie:

include "scripts/mytoolkit.php";
...
if ($val != "") saveCookie('mycookie', $val, 100*365, "www.domain.com");  // tested, $val is not empty and is a string. Want to keep the cookie for 100 years :-))
...
与mytoolkit.php

function saveCookie($name, $value, $days, $domain)
{
$expires = 0;
    // tested, $name and $value are correct and filled
    if (isset($days)) 
           $expires = time()+$days*24*60*60;   // tested, the method enters there
    setcookie ($name, $value, $expires, "/", $domain);
}
function readCookie($name)
{
    if(isset($_COOKIE[$name])) return $_COOKIE[$name];
    return null;
}

稍后,在重新加载页面后,我检查cookie并打印它:

...
$val = readCookie('mycookie');
print ($val);
...

问题是$val是空的,当然cookie也没有设置。

但是…

如果我只是替换调用:

saveCookie('mycookie', $val, 100*365, "www.domain.com");

:

setcookie ('mycookie', $val, time()+100*365, "/", "www.domain.com");

或保持

 saveCookie('mycookie', $val, 100*365, "www.domain.com");

但是从saveCookie方法中去除*24*60*60;

一切正常,$val被cookie值填满,cookie设置好了。

设置cookie的方法出了什么问题?

问题是我想把饼干保存100年。如果我设置一个有限的延迟,比如10年,它就会很好。

问题是:当我设置cookie时,为什么我可以在javascript中使用100年,为什么我不能使用PHP做同样的事情?

从http://www.php.net/set_cookie:

cookie过期时间。这是一个Unix时间戳换句话说,你很可能会用time()函数加上你之前的秒数希望它过期。或者您可以使用mktime()。时间()+ 60 * 60 * 24 * 30设置cookie在30天后过期。如果设置为0或省略,则Cookie将在会话结束时过期(当浏览器关闭时)关闭)。

问题可能是因为你试图设置一个过期时间戳超过unix时间戳限制你的php是一个32位版本。在使用32位整型的系统上,unix时间戳的限制是2038年1月19日。

从http://www.unixtimestamp.com/index.php

:

2038年1月19日会发生什么?

在此日期,Unix时间戳将因32位错误而停止工作溢出。在此之前,数以百万计的应用程序需要这样做要么采用新的时间戳约定,要么迁移到64位系统会为时间戳多买一个"位"的时间。