设置会话变量有延迟吗?仅在第一次尝试时失败

Ano*_*Man 5 php session redirect

我有一个页面,login.php,它处理用户名和密码,如果成功,它会设置会话变量,然后将用户重定向到 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");
        }
Run Code Online (Sandbox Code Playgroud)

然后 home.php 尝试收集会话变量

$sessionStatus = session_status();
if ($sessionStatus !== PHP_SESSION_ACTIVE) {
    session_start();
}
$loggedIn = $_SESSION['logged_in'];
Run Code Online (Sandbox Code Playgroud)

问题是,在第一次登录尝试时,$_SESSION['logged_in'] 未定义并生成错误,即使 login.php 成功。

Notice: Undefined index: logged_in 
Run Code Online (Sandbox Code Playgroud)

$_SESSION 的 var_dump 返回一个空数组,但 sessionStatus 报告会话已经启动,不必执行 session_start。

这会迫使用户再次登录,然后一切都很好。那么重定向是否发生得太快以至于会话变量无法设置?我应该延迟重定向吗?(我该怎么做?)或者这是我做错的其他事情?

编辑:我已经根据类似问题的答案与我的主机进行了检查,并确认会话永远不会由多个服务器提供服务,并且不需要启用粘性会话或类似的东西。我还根据下面提供的答案和其他一些研究更新了上面的代码,但错误仍然存​​在。

KIK*_*are 1

脚本结束时会话可能会自动保存。您在脚本结束之前重定向。

脚本真正结束所需的时间很大程度上取决于其他代码需要结束的内容。最好显式保存会话。

如何执行此操作取决于您使用的会话类型。一种类型可以这样关闭:

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");
}
Run Code Online (Sandbox Code Playgroud)

当您重定向时,会话应该可用于下一页。

当然,如果您的会话工作方式不同,您就必须调整代码。我想要表达的观点是:永远不要在代码中添加延迟。这是不可靠的,也是毫无意义的。只需在重定向之前保存会话即可。