我有一个页面 login.php,它处理用户名和密码,如果成功,它会设置 session 变量,然后将用户重定向到 home.php。 login.php 的相关部分在这里:
if ($pwdHash == $storedpass) {
$success = true;
$sessionStatus = session_status();
if ($sessionStatus !== PHP_SESSION_ACTIVE) {
session_start();
}
$_SESSION['user_id'] = $user;
$_SESSION['logged_in'] = true;
session_write_close();
header('Location: http://www.examplesite.com/home.php');
header("HTTP/1.1 303 See Other");
die("redirecting");
}
然后 home.php 尝试收集 session 变量
$sessionStatus = session_status();
if ($sessionStatus !== PHP_SESSION_ACTIVE) {
session_start();
}
$loggedIn = $_SESSION['logged_in'];
问题是在上第一 登录尝试, $_SESSION['logged_in'] 未定义并生成错误,即使 login.php 成功。
Notice: Undefined index: logged_in
$_SESSION 的 var_dump 返回一个空数组,但 sessionStatus 报告 session 已经启动,它不必执行 session_start。
这会强制用户再次登录,然后一切正常。那么重定向是否发生得太快以至于 session 变量无法设置?我应该延迟重定向吗? (我该怎么做?)或者这是我做错了什么?
编辑:我已经根据对类似问题的回答与我的主持人进行了核实,并确认一个 session 永远不会由多个服务器提供服务,并且不需要启用粘性 session 或类似的东西。我还根据下面提供的答案和其他一些研究更新了上面的代码,但错误仍然存在。
最佳答案
脚本结束时, session 可能会自动保存。您在脚本结束之前重定向。
您的脚本真正结束所需的时间在很大程度上取决于其他代码需要结束的内容。最好显式保存 session 。
如何做到这一点取决于您使用的 session 类型。一种类型可以这样关闭:
http://php.net/manual/en/function.session-write-close.php
如果那是您正在使用的,请执行以下操作:
if ($pwdHash == $storedpass) {
$success = true;
$_SESSION['user_id'] = $user;
$_SESSION['logged_in'] = true;
session_write_close();
header('Location: http://www.examplesite.com/home.php');
header("HTTP/1.1 303 See Other");
die("redirecting");
}
当您重定向时, session 应该可用于下一页。
如果您的 session 工作方式不同,当然您必须调整代码。我想说明的一点是:永远不要在你的代码中拖延。这是不可靠的,而且毫无意义。只需在重定向之前保存 session 。
关于php - 设置 session 变量有延迟吗?仅在第一次尝试时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43530599/