我有一个使用YII的网站。它做的一件事是将会话信息存储到MySql数据库表YiiSession中。同样在单独的表(users_sessions)中,插入了一个包含以下信息的新行:
我为会话创建了另一个表,因为YiiSession是YII的一部分。 users_session还会跟踪用户的在线状态,而YiiSession则不会。
我只在用户登录时插入users_session。
但我不明白,当用户注销时,与用户关联的会话被删除了。
请注意,users_session中的session_id是YiiSession中的一个外键。但YiiSession中的那个仍然存在,即使它有一个到期日期。
可能删除该行的机制是什么?请帮忙。
答案 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);