【问题标题】:Php session unset randomlyphp会话随机取消
【发布时间】:2016-12-30 15:29:25
【问题描述】:

我使用自定义会话处理程序来保存和读取数据库中的会话数据:

class c_session implements SessionHandlerInterface {

    private $db; // Database

    // Constructor
    public function __construct($database){
        $this->db = $database;

        session_set_save_handler(
            array($this, 'open'),
            array($this, 'close'),
            array($this, 'read'),
            array($this, 'write'),
            array($this, 'destroy'),
            array($this, 'gc')
        );
        register_shutdown_function('session_write_close');
    }

    // Custom made session start
    public function start_session() {
        global $globals; // Included in config.php

        // Make sure the session cookie is not accessible via javascript.
        $httponly = true;

        // Force the session to only use cookies, not URL variables.
        ini_set('session.use_only_cookies', 1);

        // Get session cookie parameters and set the parameters
        $cookieParams = session_get_cookie_params();
        session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $globals['https'], $httponly);

        // Change the session name
        session_name($globals['session_name']);

        // Now we can start the session
        session_start();
    }
...

在每个网页中,我都会阅读会话以检查用户是否已登录:

function signin_check($db, $session) {
    global $globals; // Included in config.php
    $session->start_session();
    try {
        // Check if all session variables are set
        if(isset($_SESSION['A'], $_SESSION['B'])) {
...

如果她没有,她将退出。

变量$_SESSION['A']$_SESSION['B']在登录页面中设置。

系统在 99% 的情况下都能完美运行,但有时,在更改网页时,它会随机将您注销。发生这种情况是因为 $_SESSION['A']$_SESSION['B'] 在没有(已知)原因的情况下未设置。

为什么以及如何防止这些注销?

【问题讨论】:

  • 乍一看,您的会话似乎超时了。如果你可以检查你的 php.ini 设置,你能看到 session.cookie_lifetime 和 session.gc_maxlifetime 的设置吗?

标签: php session


【解决方案1】:

要么会话超时,正如@Rat 在他/她的评论中指出的那样,要么有一个代码块由于某种原因未设置$_SESSION["A"]$_SESSION["b"]。检查哪些页面是发生这种情况的页面。如果您可以在未注销的情况下访问这些页面,但“有时”您已注销,那么您的设置存在问题。否则,您应该查看页面的代码以查看它们将您注销的位置。

【讨论】:

  • php.ini 设置是默认的 nginx 设置。我所做的唯一更改是: session.cookie_httponly = 1,session.cookie_secure = 1。我正在使用 php-fpm。问题不排除某些页面,有时会随机发生。我认为这是由竞争条件引起的。
  • @Medicalphysicist session.cookie_lifetime 和 session.gc_maxlifetime 的值是多少?
  • session.cookie_lifetime = 0, session.gc_maxlifetime = 1440
  • @Medicalphysicist 你现在可以测试登录并在两天零一分钟后检查你是否登录了吗?
猜你喜欢
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2018-05-25
  • 1970-01-01
  • 2014-07-24
  • 2020-05-20
相关资源
最近更新 更多