我有一个需要在特定时间创建新会话ID的应用程序。现在,这导致用户注销,因为$ _SESSION最终为空。
我的理解是,regenerate_session_id()应该保留会话信息,只需更改会话ID(意味着$ _SESSION ['someVar']将在后续请求中可用。
我发现$ _SESSION在后续请求中为空。
我尝试过复制数据:
$session = $_SESSION;
session_regenerate_id();
$_SESSION = $session;
但这没有帮助。如果我注释掉session_regenerate_id();后续页面正确加载(填充$ _SESSION数组并且用户保持登录状态。)
我有一个开发环境,我刚刚设置运行较新版本的PHP(5.5),这段代码正如我所期望的那样运行。我不知道有任何其他差异。
我错过了什么?提前致谢。
答案 0 :(得分:0)
session_start();
$_SESSION['name'] = "mike";
session_regenerate_id();
echo $_SESSION['name'];
输出'mike'
答案 1 :(得分:0)
我在服务器上进行了一些测试,似乎工作正常。
<?php
session_start();
$old = session_id();
$_SESSION['name'] = "mike";
session_regenerate_id();
$new = session_id();
echo $_SESSION['name']."<br/>\n";
echo $old ."<br/>". $new
?>
以下是输出示例:
mike
d9oog3vo55936m3088o25qqe27
m6qq99pp1c80mit8e66ho3hfn3
正如您所看到的,它正在改变会话ID并保持会话变量到位,正如它应该的那样。也许您的托管服务提供商在php.ini中有一些时髦的设置?你可能想看一下。
或者,这有点麻烦,难道你不能创建一个带有密钥的cookie,它会在它们注销后立即重新登录,然后删除cookie吗? < / p>
经过一夜好眠,我发现你可能有一些标题问题。会话仅在其设置的同一域中有效,因此,例如,如果您在www.example.com
中设置会话变量,然后使用标头重定向到header("location:example.com");
,则会话变量将为空,如它们未设置为该域,它们设置为www.example.com
。我会查看你的代码并查看是否存在问题,正如你所说,它在你的沙盒中工作正常。