重新加载页面后$ _SESSION为空

Top*_*ort 6 php

我的脚本test.php在下面.当我单击Submit时,它会将其作为登录尝试进行处理并成功设置$_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>
Run Code Online (Sandbox Code Playgroud)

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

Linux服务器成功运行WordPress,所以它的设置不能太奇怪.刚刚按照建议进行了系统升级.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 
Run Code Online (Sandbox Code Playgroud)

使用Chrome,Firefox和IE的行为是相同的.

TIA.

Jan*_*tis 0

似乎有2个问题:

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

ini_set('session.save_path', '/tmp');
Run Code Online (Sandbox Code Playgroud)

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

ini_set('session.cookie_path', '/');
Run Code Online (Sandbox Code Playgroud)

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

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

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