【问题标题】:$_SESSION is empty after reloading page重新加载页面后 $_SESSION 为空
【发布时间】:2018-02-09 15:39:32
【问题描述】:

下面是我的脚本test.php。当我单击提交时,它会将其作为登录尝试处理并成功设置$_SESSION 变量。但是当我重新加载页面(通过单击返回自身的链接)时,$_SESSION 是空的。

<?php
    //test.php

    session_start ();

    function isUserLoggedIn (&$username)    
    {
        $loggedIn = isset ($_SESSION['loggedin']);
        if ($loggedIn) 
            $username = $_SESSION['user']; 
        else 
            $username = ''; 

        return $loggedIn;
    }

    function processLogin () 
    {               
        $_SESSION['loggedin'] = TRUE;
        $_SESSION['user']  = "podunk";

        session_write_close ();         
    } 

    echo '$_SESSION before we do anything..................: '; 
    print_r ($_SESSION); 
    echo "<br>";

    if (isset($_POST['Submit'])) processLogin ();

    $loggedIn = isUserLoggedIn ($username); 

    echo '$_SESSION after processing any login attempt: '; 
    print_r ($_SESSION); 
    echo "<br>";

    if ($loggedIn) 
        echo "I AM LOGGED IN as $username!"; 
    else 
        echo "I am logged out :(";
?>

<html>
  <body>    
    <form name="form1" method="post" action="test.php"> 
        <input type="submit" name="Submit" value="Login">
    </form>

    <a href="test.php">Reload page</a>
  </body>
</html>

这是我在我的 Linux apache2 服务器上运行它的时候。当我在 XAMPP 上运行它时,$_SESSION 仍然存在并且用户保持登录状态。所以我猜这与 php.ini 有关系......但也许我在这里犯了一个错误,XAMPP 正在被原谅。

Linux 服务器正在成功运行 WordPress,所以它的设置不会太奇怪。刚刚做了系统升级,recommended。 session.save_path 存在并且其中有一些今天过时的东西,所以我认为它正在工作,虽然它由 root 拥有而不是 www-data,所以如果这是一个问题,请 IDK。

这里有一些来自 php 信息的其他内容。关于那个 cookie_path 的 IDK,所以我将其更改为与 session.save_path 相同的位置,FWIW。

session.auto_start  On  On
session.cache_expire    180 180
session.cache_limiter   nocache nocache
session.cookie_domain   no value    no value
session.cookie_httponly Off Off
session.cookie_lifetime 0   0
session.cookie_path /   /
session.cookie_secure   Off Off 

使用 Chrome、Firefox 和 IE 时的行为是相同的。

TIA。

【问题讨论】:

  • 你可以在存放session的目录中检查你是否有写权限。
  • 您的 PHP 配置是否设置为允许基于 cookie 的会话? session.use_cookies php.net/manual/en/…
  • 你能测试一下session_write_close()是返回true还是false
  • R: $var_dump($_COOKIE) 确实显示了一些 cookie;当我重新加载页面时,它们都没有改变,但它们看起来都不相关(它们没有被命名为“session_id”或“session”或类似的名称。

标签: php


【解决方案1】:

你的脚本流程基本上是这样的

start the session

run processLogin();

run isUserLoggedIn()

但是,在您的 processLogin() 中,您使用 session_write_close() 强制关闭会话,因此当您到达 isUserLoggedIn() 并查询会话的内容(现已关闭)时,您似乎没有登录。

尝试在不强制会话关闭的情况下运行代码。

我不得不说我一直在问为什么这似乎适用于您的一种环境!

【讨论】:

  • 为什么要关闭(或强制)您的会话?
  • 好的,我做到了。还没有效果。 ...我这样做的原因是,当我在寻找解决方案时,我发现有人说这样做会强制写入会话变量。无论如何,它现在已经消失了。
  • 不,我的意思是我把那条线拿出来了,但它并没有改变问题。没有这样的运气!
【解决方案2】:

似乎有两个问题:

1) 您的 session.save_path 不可写。正如我从您的 cmets 中了解到的那样,您已经解决了这个问题。无论如何,请尝试将其设置在您的脚本之上,以确保:

ini_set('session.save_path', '/tmp');

2) 您将 session.cookie_pathsession.save_path 混淆了,这两个设置完全不同。将 session.cookie_path 设置为 /,这是指您的 url 路径

ini_set('session.cookie_path', '/');

如何在 unix 中使会话目录可写

  1. 创建“/tmp/sessions”目录
  2. 在终端运行chown www-data:www-data /tmp/sessions
  3. ini_set('session.save_path', '/tmp/sessions');

最后,检查该文件夹中的所有者会话文件。

【讨论】:

  • 好的,确实进行了这些更改并重新启动了 apache2 和 php。还没有帮助。
  • 好的,我有一些工作!正如你所说,我做了chown www-data /tmp/sessionschmod 700 /tmp/sessions。 (我以为我在 2 天前就这样做了,但我又试了一次,因为我正在使用其他人的修复程序。)我对这个目录中出现的文件数量如此之快感到震惊。我可以做? ...现在将使用它一段时间,看看解决方案是否可靠。
  • 问题已解决,包括我最初正在处理的 pre-minimal reproducible example 问题,所以这不是我尝试的其他任何事情。 J,我想请您从您之前的评论中重复修复路径不可写的问题,以供后代使用;这可能很明显,但这是解决方法。感谢您的所有帮助。
【解决方案3】:

我确定您正在关闭会话,然后调用函数。

使用session_write_close — 您写入会话数据并结束会话

尝试使用session_is_registered - 查明是否在会话中注册了全局变量而不是session_write_close,以便查看此数据是否已在您的服务器上注册。

【讨论】:

  • 我试过了,但它使 PHP 崩溃了,因为我有一个最新版本并且不推荐使用 session_is_registered
  • 我明白了。您可以尝试将其排除在外。如果是服务器设置,您将不得不通过日志。无需编写会话并关闭它。如果您仍然有问题,让我们看看我们可以在服务器端为您做些什么。
  • 问题已解决(请参阅上面接受的答案)。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 2014-02-12
  • 2016-05-12
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
相关资源
最近更新 更多