当用户在YII中注销时,将删除与会话关联的行

时间:2014-05-23 10:34:44

标签: php mysql yii

我有一个使用YII的网站。它做的一件事是将会话信息存储到MySql数据库表YiiSession中。同样在单独的表(users_sessions)中,插入了一个包含以下信息的新行:

  • 会话ID
  • 用户ID
  • 用户的在线状态

我为会话创建了另一个表,因为YiiSession是YII的一部分。 users_session还会跟踪用户的在线状态,而YiiSession则不会。

我只在用户登录时插入users_session。

但我不明白,当用户注销时,与用户关联的会话被删除了。

请注意,users_session中的session_id是YiiSession中的一个外键。但YiiSession中的那个仍然存在,即使它有一个到期日期。

可能删除该行的机制是什么?请帮忙。

1 个答案:

答案 0 :(得分:0)

您应该扩展CDbHttpSession并覆盖方法destroySession($id)。在那里你附加代码并删除你的条目。

配置Yii以使用您的会话类而不是它在config / main.php中的自己的会话类:

'session' => array(
    'autoStart' => true,
    'class' => 'application.components.<your session class name>',
    'connectionID' => 'db',
    'sessionTableName' => 'session',
    'autoCreateSessionTable' => false,
    'timeout' => 3600, // 60 min
),

但是我不会使用单独的表来执行此操作,只需在YiiSession表中添加一些字段即可。这就是我所做的,而且效果非常好。

修改 您应该在MyDbHttpSession.php中创建名为protected/components的文件。 在这个文件中扩展CDbHttpSession如下:

class MyDbHttpSession extends CDbHttpSession
{
    protected function createSessionTable($db, $tableName)
    {
        // basically this is a copy of CDbHttpSession

        $db->createCommand()->createTable($tableName, array(
            'id' => 'CHAR(32) PRIMARY KEY',
            'expire' => 'integer',
            'data' => $blob,
            // your additional fields
            'idUser' => 'INT(10) NULL',
            'online' => 'TINYINT(1)',
            // more of your fields here if you have
        ));
    }

    // this sets the user ID by session ID
    public function setIdUser($idUser)
    {
        $db = $this->getDbConnection();
        $db->setActive(true);
        $db->createCommand()->update($this->sessionTableName, array('idUser' => (int) $idUser),
            'id=:id', array(':id' => $this->sessionId)
        );
    }

    // and this sets the online status, pass true or false to $online
    public function setOnline($online)
    {
        $db = $this->getDbConnection();
        $db->setActive(true);
        $db->createCommand()->update($this->sessionTableName, array('online' => (int) $online),
            'id=:id', array(':id' => $this->sessionId)
        );
    }
}

设置Yii使用你的会话类而不是像我上面写的那样。

您应该已经有一个班级WebUser。如果没有,请在protected/components中创建一个并展开CWebUser。 在此课程中添加方法afterLogin

public function afterLogin($fromCookie)
{
    // store user ID and online status in session table
    Yii::app()->session->setIdUser($this->id);
    Yii::app()->session->setOnline(true);

    return parent::afterLogin($fromCookie);
}

您可以在Yii的任何地方使用Yii::app()->session->setOnline(true);Yii::app()->session->setOnline(false);