【问题标题】:Sometimes Session variables stop working有时会话变量停止工作
【发布时间】:2013-05-04 00:16:45
【问题描述】:

我已经吃过两次了。出乎意料的是,我的登录系统停止工作,通过调试我发现 $_SESSION 变量在登录过程中无法生存。然后,在没有明显原因的情况下,它恢复工作。流程如下:

  1. 用户登录index.html,表单提交至login.php
  2. login.php 进行基本的健全性、isset 和空检查,然后使用数据库检查凭据。如果电子邮件地址和密码正确(即存在于数据库中)将它们放入$_SESSION 变量并将用户重定向到home.php
  3. home.php 检索 $_SESSION 变量。在这里它失败了。

第二次(几分钟前)我阅读了有关它的更多信息,并找到了一个论坛主题,我上次没有阅读它(当会话变量再次起作用时,我停止阅读它)说你需要拥有<?php 而不是 <? 之前的 session_start();。我尝试了它,没想到它会起作用,但是当我登录时,直接在更改之后(这是我更改 AFAIK 的唯一一件事)它起作用了。找到原因了吗?让我们在将<?php 改回<? 后检查一下。它仍然有效。这可能是什么原因造成的,我该如何预防(或者,如果无法预防,请检测发生了什么)?

编辑:

有趣的事情:我有一个小实用函数来检查用户是否登录:

function assertUserLogin() {
        try {
            $user = new User($_SESSION['email'], $_SESSION['pwd']);
        } catch(Exception $ex){
            writeToLog("Exception: " . $ex->getMessage());
            header("Location: http://www.korilu.nl/maurits/anw?requested:" . $_SERVER["REQUEST_URI"]);
        }
        writeToLog($user->email . " logged in\n");
        
        return $user;
    }

所以我可以这样做:

<?
    session_start();
    $user = assertUserLogin();
?>

在用户需要登录的每个页面上。有趣的是,如果失败(如上所述),它会调用我的函数writeToLog()log() 已被 PHP 标准库采用) :

function writeToLog($string) {
        $log = fopen("log.txt", "w");
        fwrite($log, $string);
        fclose($log);
    }

这很简单。但是日志仍然是空的。 (我确信函数writeToLog() 被调用,因为我被重定向到http://www.korilu.nl/maurits/anw?requested:/maurits/anw/home.phpassertUserLogin() 函数是唯一这样做的地方。)

【问题讨论】:

  • 如果你提供你的代码sn-p,它可能很容易理解你的问题。
  • 您的浏览器可能会导致此问题,例如它可能会丢失 cookie 来跟踪您的会话。某些防病毒软件或某些东西可能会导致此问题。好吧,一个快速测试是在其他系统上尝试相同的站点,同时也在其他网络上尝试。

标签: php session session-variables


【解决方案1】:

在脚本结束的所有地方尝试session_write_close();,例如exit;die();和页面结束。

【讨论】:

  • 感谢您的回答。我现在正在努力。这是为什么呢?
  • 我刚读过它们。唉,它没有工作。 header("Set-Cookie: PHPSESSID=" . session_id() . "; path=/"); 两者都没有。
  • 在发送 header() 之前你是否调用session_write_close();
  • 啊,对不起,我不知道我必须按这个顺序。
  • 没有想法......在浏览器中检查正在设置 cookie 并检查到期日期。
【解决方案2】:

我发现这是一个特定于浏览器的问题。我认为这是由 Google Chrome 引起的,因为一旦我使用移动 Safari 或 Mozilla Firefox 测试会话,它就会消失。虽然在高级设置中我可以看到 PHPSESSID cookie,但它并没有获取会话。

重要修改

我错了。 Mozilla 也开始放弃会话。在我删除会话 (session_destroy()) 后,它再次工作。所以我的猜测是,在服务器上的会话过期后,浏览器仍然有PHPSESSID cookie。如果它把它发送到服务器,服务器找不到会话,只是在$_SESSION 中放置一个空数组,让我一无所知。我希望这可以帮助遇到同样问题的人。

【讨论】:

  • 真的很奇怪......就像......在登录之前删除会话可以解决问题?
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
相关资源
最近更新 更多