您應該擴展CDbHttpSession
並覆蓋方法destroySession($id)
。在那裏你追加代碼並刪除你的條目。
配置的Yii使用會話類,而不是它自己的配置/ main.php:
'session' => array(
'autoStart' => true,
'class' => 'application.components.<your session class name>',
'connectionID' => 'db',
'sessionTableName' => 'session',
'autoCreateSessionTable' => false,
'timeout' => 3600, // 60 min
),
但是我不會這麼做有一個單獨的表,只是將某些字段添加到YiiSession表。這就是我所做的,它工作得很好。
編輯: 您應該創建一個在protected/components
名爲MyDbHttpSession.php
文件。 在這個文件中,像這樣延長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);
我想你可以那句你的問題更好。 「但我不明白,當用戶註銷時,與用戶關聯的會話被刪除。」通常會話刪除(銷燬)包含在註銷中,因此非常合理,我想你是從SQL角度談論的,但要確保你需要重新說明這一點。 – Jonast92
嗨Jonast92,我不明白它是如何得到刪除user_session(該表由我創建的),但不是在YiiSession(該表是Yii設置的一部分)。並刪除它的機制? – ethereal1m