设置 $_SESSION 在使用 XAMPP 的本地主机上不起作用


Setting $_SESSION doesn't work on localhost using XAMPP

我在PHP代码中这样设置了我的会话:$_SESSION['user_id'] = $login;,这在上传到我的服务器并跨不同页面时似乎工作正常,但是当我在本地机器上测试网站时,会话似乎在将脚本留在设置的位置后立即变得未设置。

我正在使用 XAMPP 和完全相同的代码在本地机器上进行测试。

我不确定为什么会出现这个问题,并将不胜感激任何有用的答案。

不起作用的示例:

$_SESSION['user_id'] = $login;
echo '<META HTTP-EQUIV="refresh" content="0;URL=../home.php">';  

编辑 1:

这是我登录的整个函数(它是类的一部分):

public function loggingIn(){
    session_start();
    $db = new Database('localhost','root','','userdata');
    $userFunctions = new Users($db);
    $username = $_POST['usernameInput'];
    $password = $_POST['passwordInput'];
    if(empty($username) || empty($password)){
        $this->errors['u&p'] = 'Please Enter Your Username AND Password';
        $this->printE();
    } elseif($userFunctions->user_exists($username)===false){
        $this->errors['nm'] = 'That Username/Password Combination Is Not Valid';
        $this->printE();
    } else {
            $login = $userFunctions->login($username, $password);
    if($login === false){
            $this->errors['nm'] = 'That Username/Password Combination Is Not Valid';
            echo 'Login Failed!';
        } else  {
           if(!$userFunctions->economyTableExistsForUser($login)){
               $userFunctions->createEconomyTableForUser($login);   
           }
           if(!$userFunctions->schoolTableExistsForUser($login)) {
               $userFunctions->createSchoolTableForUser($login);    
           }
               $_SESSION['user_id'] = $login;
               echo $_SESSION['user_id'];  // working fine
               header('Location: ../home.php');
        }
    }   
}

让我们猜测您的家用机器没有:

session.autostart = On

在你的PHP.ini中,而你的另一台机器显然是。

确保已在 PHP 代码中设置:

session_start();

PHP: session_start - 手动

如果你不这样做,那么你的会话就不会开始,除非我的第一个猜想是正确的。

此外,您必须在本地主机上检查PHP版本和php.ini中的设置。确保存储会话文件的目录是可写的,并且会话文件确实存在。

编辑 1:

您最好使用 PHP 解决方案进行重定向:

header("Location: /");
exit();

编辑2:

PHP 具有修改 HTTP 标头的函数。其中一些:

  • 页眉
  • session_start
  • 设置饼干

编辑3:

换行符和空格可能是一个问题,但也有一些不可见的字符序列可能导致Warning: Cannot modify header information,如UTF-8 BOM(字节顺序标记)。尝试重新保存文件,确保文件保存得与UTF-8 (no BOM)一样。

编辑4:

要正确调试代码,请确保 PHP 显示所有警告和通知。在会话开始之前运行它:

ini_set('display_errors', -1);

编辑5:

您还必须检查session.gc_maxlifetime设置:


session.gc_maxlifetime session.gc_maxlifetime指定数据被视为"垃圾"并清理的秒数。垃圾回收在会话启动期间发生。

编辑6:

要查看崇高文本中的空白,请编辑设置:

// Set to "none" to turn off drawing white space, "selection" to draw only the
// white space within the selection, and "all" to draw all white space
"draw_white_space": "selection",

您可以在首选项->设置默认值中进行设置。如果您编辑用户设置首选项->设置 - 用户并按如下方式添加行:

{
    "font_size": 10,
    "draw_white_space": "all"
}

还要确保它显示所有其他特殊字符以正确调试您的代码!

编辑7:

最后尝试在重定向之前添加session_write_close();

编辑8:

在 PHP 文件中设置,在 session_start(); 之前,session.save_path = "/home/username/tmp";指令。在public_html之外创建tmp目录。 确保tmp目录具有 chmod 770 并且使用相同的用户/组权限创建。在主目录中运行ls -lsa以检查新目录是否与其他目录(例如public_html)具有相同的用户/组。如果没有,请确保通过运行 chown username:groupname /home/username/tmptmp 上以 root 身份更改权限。

对此的快速更新。 我发现这个响应非常有用,但是,请注意,在我的XAMPP安装中,session.autostart=On的php.ini条目略有不同。 我发现了以下内容:

;在请求启动时初始化会话。;http://php.net/session.auto-startsession.auto_start=0

我将其更改为:

;在请求启动时初始化会话。;http://php.net/session.auto-startsession.auto_start=1

确保在

php.ini中启用了会话 cookie ( xamp'php'php.ini )。

session.use_cookies=1

在你的 php 中.ini检查:

  1. variables_order包含字母S
  2. 检查session.save_path是否存在,并且可由运行 PHP 的用户写入。

如果你使用的是嵌入在 .htm/.html 文档中的 PHP,你需要确保 Apache 可以适当地处理它们。这是通过编辑 httpd.conf 并添加行来完成的

AddType application/x-httpd-php .html .htm

到第 <IfModule mime_module> 部分

我正在与这个问题作斗争,但解决了...

在您的/opt/lampp/etc/php.ini中尝试更改此行:

session.save_path = "/var/lib/php/session"

为此:

session.save_path = "/opt/lampp/var/session"

注意:也许您需要在/opt/lampp/var中创建文件夹"会话"

  1. 开放式php.ini
  2. 使用"1"更改session.auto_start
  3. "Stop" 阿帕奇(如果正在运行)
  4. "Save" php.ini
  5. "Start" 阿帕奇
Session Issue Fixed in Xampp 7.1.6 with following Changes in php.ini
Line #1403 set: 
session.auto_start = 1    

我在现场工作 Xampp 没有遇到类似的问题。

在我的情况下,诀窍是禁用下面的两行。

header('Set-Cookie: same-site-cookie=huis; SameSite=Lax');
header('Set-Cookie: cross-site-cookie=stijl; SameSite=None; Secure');

因此,我的建议是检查任何修改有关coockies的内容

> 请在 php ini 中检查您的"session.cookie_path"。默认情况下,它是"session.cookie_path=/"

在 php.ini (C:''xamp''php''php.ini 中启用会话 cookie。

改变

session.use_cookies=0

session.use_cookies=1

并记得重新启动 xampp