发现问题,见下文末尾
我有一个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位系统会为时间戳多买一个"位"的时间。