gpt4 book ai didi

php - 当用户在 YII 中注销时,与 session 关联的行将被删除

转载 作者:行者123 更新时间:2023-11-30 00:13:49 24 4
gpt4 key购买 nike

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

  • session ID
  • 用户 ID
  • 用户在线状态

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

我只在用户登录期间插入users_session。

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

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

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

最佳答案

您应该扩展CDbHttpSession并覆盖方法destroySession($id)。您可以在此处附加代码并删除您的条目。

配置 Yii 使用你的 session 类而不是 config/main.php 中它自己的 session 类:

'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 使用你的 session 类,而不是像我上面写的那样使用它自己的 session 类。

您应该已经有一个类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(假);

关于php - 当用户在 YII 中注销时,与 session 关联的行将被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23826977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com