我想在yii2应用程序中显示所有登录用户的列表.现在我正在使用一个布尔变量'is_login',它在用户登录时设置,在用户注销时取消设置.现在问题是如果用户关闭浏览器而不注销它将在登录用户中显示.如何仅显示活动用户.
我不认为在每次点击时或每当他/她在网站上做某事时都存储用户活动是正确的方法,这会使网站太麻烦吗?我在询问Yii2中是否有任何标准方法或方法可用.
这里正确的方法是直接使用活动会话列表.默认情况下,会话存储在文件系统中(每个都在自己的文件中),使用它们可能不方便.如果您使用yii\web\DbSession存储而不是默认存储,那么对您来说会更容易yii\web\Session.然后,您将能够直接从数据库查询所有会话.
这是samdark的建议:https://github.com/samdark/yii2-cookbook/issues/92
可以通过使用数据库会话并将其他信息写入表中来解决:
'session' => [
'class' => 'yii\web\DbSession',
'writeCallback' => function ($session) {
return [
'user_id' => Yii::$app->user->id,
'last_write' => time(),
];
},
],
Run Code Online (Sandbox Code Playgroud)
然后通过SQL很容易使用它:
-- Get all users active in recent hour
SELECT user_id FROM session WHERE last_write - 3600 < :now;
Run Code Online (Sandbox Code Playgroud)
PS在使用此配置之前,您应该执行迁移以将session表添加到数据库并添加字段user_id和last_write.
默认迁移在此路径下:vendor/yiisoft/yii2/web/migrations.
或者只是执行这样的事情(应该采用你的情况):
CREATE TABLE session
(
id CHAR(40) NOT NULL PRIMARY KEY,
expire INTEGER,
data BLOB,
user_id INTEGER,
last_write TIMESTAMP
)
Run Code Online (Sandbox Code Playgroud)
要了解有关Yii2会话的更多信息,请访问Yii2指南的这一部分.