regenerate_session_id销毁会话信息


regenerate_session_id destroying session information

我有一个应用程序需要在特定时间创建新的会话ID。现在,这导致用户注销,因为 $_SESSION 最终为空。

我的理解是,regenerate_session_id() 应该保留会话信息并仅更改会话 ID(这意味着 $_SESSION['someVar'] 将在后续请求中可用。

我发现 $_SESSION 在后续请求中是空的。

我尝试复制数据:

$session = $_SESSION;
session_regenerate_id();
$_SESSION = $session;

但这并没有帮助。如果我注释掉 session_regenerate_id();后续页面正确加载(填充 $_SESSION 数组,用户保持登录状态)。

有一个开发环境,我最近刚刚设置了运行较新版本的 PHP (5.5),并且此代码按我预期运行。我不知道任何其他差异。

我错过了什么?提前谢谢。

session_start();
$_SESSION['name'] = "mike";
session_regenerate_id();
echo $_SESSION['name'];

输出"迈克"

我在服务器上做了一些测试,它似乎工作正常。

<?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?

经过一夜好眠,我突然想到你可能有一些标题问题。会话仅在设置它们的同一域中有效,因此,例如,如果您在 www.example.com 中设置会话变量,然后使用标头重定向到 header("location:example.com"); ,您的会话变量将为空,因为它们不是为该域设置的,而是为www.example.com设置的。我会检查您的代码,看看这是否是问题所在,正如您所说,它在您的沙箱中运行良好。