有时会话变量停止工作



我已经经历过两次了。突然,我的登录系统停止工作了,通过调试,我发现$_SESSION变量在登录过程中失效了。然后,没有明显的原因,它又开始工作了。下面是流程:

  1. 用户在index.html登录,表单提交给login.php;
  2. login.php做基本的健全,isset和空检查,然后检查凭据与数据库。如果电子邮件地址和密码是正确的(即数据库中存在),则将其放在$_SESSION变量中,并将用户重定向到home.php
  3. home.php检索$_SESSION变量。

第二次(几分钟前)我读了更多关于它,发现一个论坛线程,我没有读过以前发生的事情(当会话变量再次工作时,我停止阅读它),它说你需要在session_start();之前有<?php而不是<?。我尝试了它,并不期望它能工作,但当我登录后,直接改变(这是我唯一改变的东西),它工作了。导致发现?让我们在将<?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 inn");
        
        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()函数是唯一可以这样做的地方。)

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

我发现这是浏览器特有的问题。我认为这是由Google Chrome造成的,因为只要我使用移动Safari或Mozilla Firefox测试会话,它就会消失。虽然在高级设置中我可以看到PHPSESSID cookie,但它没有拾取会话。

<标题>重要编辑我错了。Mozilla也开始放弃会话。在我删除会话(session_destroy())之后,它再次工作了。所以我的猜测是,会话在服务器上过期后,浏览器仍然有PHPSESSID cookie。如果它将其发送到服务器,服务器无法找到会话,只是在$_SESSION中放置一个空数组,让我无能为力。我希望这能帮助到有同样问题的人。

最新更新