PHP - 在浏览器重启后设置Session,但PHP不是这样

时间:2013-06-25 19:53:24

标签: php session cookies browser restart

我见过像我这样的各种问题,但没有一个能提供正确答案。 我有一个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

3 个答案:

答案 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生存期可能还不够。