如何获取Yii2中所有登录用户的列表?

Vin*_*ngh 2 php yii yii2

我想在yii2应用程序中显示所有登录用户的列表.现在我正在使用一个布尔变量'is_login',它在用户登录时设置,在用户注销时取消设置.现在问题是如果用户关闭浏览器而不注销它将在登录用户中显示.如何仅显示活动用户.

我不认为在每次点击时或每当他/她在网站上做某事时都存储用户活动是正确的方法,这会使网站太麻烦吗?我在询问Yii2中是否有任何标准方法或方法可用.

oak*_*max 5

这里正确的方法是直接使用活动会话列表.默认情况下,会话存储在文件系统中(每个都在自己的文件中),使用它们可能不方便.如果您使用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_idlast_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指南的这一部分.