PHP-会话是在浏览器重新启动后设置的,但PHP的行为是不一样的;t


PHP - Session is set after browser restart, but PHP acts as isn't

我见过各种各样的问题,但都没有给出正确的答案。我有一个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脚本显然忽略了is,并输出'No session was set...'。。。

提前感谢

Isaiah v.Hunen

您试图做的并不是实现这一目标的正确方法。会话有两个部分,一个cookie的会话id默认设置为在会话结束时过期(通常是浏览器关闭),另一个服务器端存储机制在收到最后一个请求后的一段时间后自动清理。

你想做的是将会议延长到两周。虽然您可以更改cookie设置并增加会话垃圾收集的超时时间,但这样做不是很可靠。

相反,您希望使用存储在cookie中的一次性密钥,该密钥充当备用登录路径。这个cookie可以像正常登录一样重新创建会话。为了保持安全,需要考虑一些细节,但它会实现你想要实现的目标。

在某个cookie中设置session_id并不意味着它就是会话cookie。大多数浏览器都会在浏览器关闭时清除会话cookie。这就是你所看到的。查看浏览器中会话有效时设置的cookie,并将其与浏览器重新启动后仍保留的cookie进行比较。你会注意到你的真实会话cookie不见了。

引用手册:

会话名称将重置为存储在session.name中的默认值在请求启动时间。因此,您需要为每个请求(以及session_start()或session_register()之前的调用)。

此外,如果您想更改会话cookie的生存期,请使用session_set_kokie_params,而不是强制使用您自己的cookie。

另请阅读会话垃圾收集和配置,更改cookie生存期可能还不够。