我见过像我这样的各种问题,但没有一个能提供正确答案。 我有一个PHP脚本:
session_start();
setcookie(session_name('DSWLogin'),session_id(),time()+2*7*24*60*60, '/');
//This will only be set once (when the user logs in)
$_SESSION['test'] = 'Yup, I am working';
if (isset($_SESSION['test'])){
echo 'Session is set and ready!';
} else {
echo 'No session was set...';
}
并且浏览器重启后一切正常除之外,我的PHP脚本会忽略该会话。
当我的浏览器尚未重新启动时,它echo 'Session is set and ready!';
就好了。
当我查看我的cookie选项卡时,确实会说一个名为DSWLogin
的cookie已设置为某个值。
当我重新启动浏览器时,我的Cookie标签仍然显示名为DSWLogin
的Cookie已设置为与重启前相同的值,因此它仍然存在!
但我的PHP脚本显然忽略了,并输出'No session was set...'
...
提前致谢,
Isaiah诉Hunen
答案 0 :(得分:2)
你想要做的并不是实现这一目标的正确方法。会话有两个部分,一个cookie,其会话ID默认设置为在会话结束时到期(通常是浏览器关闭),以及服务器端存储机制,在收到最后一个请求后的一段时间后自动清理
您要做的是将会话延长至两周。虽然您可以更改cookie设置并增加会话垃圾回收的超时,但这并不是非常可靠。
相反,您希望使用存储在Cookie中的一次性密钥作为备用登录路径。这个cookie可以像正常登录一样重新创建会话。为了保持安全,需要考虑一些细节,但它会做你想要实现的目标。
答案 1 :(得分:0)
仅仅因为你在某个cookie中设置session_id并不意味着它是会话cookie。大多数浏览器会在浏览器关闭时清除会话cookie。这就是你所看到的。查看您的会话有效时设置的浏览器中的cookie,并将其与浏览器重新启动后仍保留的cookie进行比较。您会注意到您的真实会话cookie已丢失。
答案 2 :(得分:0)
引用manual:
会话名称重置为存储在session.name中的默认值 在请求启动时。因此,您需要调用session_name() 每个请求(以及在session_start()或session_register()之前) 叫)。
此外,如果您想更改会话Cookie的生命周期,请使用session_set_cookie_params而不是强制使用自己的Cookie。
另请阅读有关会话垃圾收集和configuration的信息,更改Cookie生存期可能还不够。