繁体   English   中英

在线用户柜台Yii2

[英]online user counter Yii2

我要计算Yii 2应用程序中的所有在线用户,您的解决方案是什么?

甚至我也想统计通过身份验证的用户。 一种解决方案是在登录时使用身份验证方法,登录后我在db中设置一条记录。 但是这里我有一个问题。 我应该如何确定用户何时离线? 如果我在注销操作中更改了在线标志,则存在一些问题。 也许有些用户没有登录就关闭了浏览器。 然后数据库将在线显示他。 什么是解决此问题的最佳方法?

编辑

我的问题是如何克服会话过期方法。 不更改到期时间。 更详细地讲,我想确定即使用户关闭了浏览器却没有注销操作,该用户是否也处于脱机状态

您可以将会话存储在数据库中,框架将为您处理过期。

这个例子来自高级模板,我已经从前端用户那里进行了会话。

我需要创建并使用自定义组件来存储用户ID。

1)在db上创建一个表:

    CREATE TABLE `session_frontend_user` (
    `id` char(80) CHARACTER SET utf8 NOT NULL,
    `user_id` int(11) DEFAULT NULL,
    `ip` varchar(15) CHARACTER SET utf8 NOT NULL,
    `expire` int(11) DEFAULT NULL,
    `data` longblob,
    PRIMARY KEY (`id`),
    KEY `expire` (`expire`)
    ) ENGINE=InnoDB

2)从此表创建模型:

<?php

namespace common\models;

use Yii;

/**
 * This is the model class for table "session_frontend_user".
 *
 * @property string $id
 * @property integer $user_id
 * @property string $ip
 * @property integer $expire
 * @property resource $data
 */
class SessionFrontendUser extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'session_frontend_user';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['id', 'ip'], 'required'],
            [['user_id', 'expire'], 'integer'],
            [['data'], 'string'],
            [['id'], 'string', 'max' => 80],
            [['ip'], 'string', 'max' => 15]
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'user_id' => 'User ID',
            'ip' => 'Ip',
            'expire' => 'Expire',
            'data' => 'Data',
        ];
    }
}

3)在config / main.php中更改配置

'components' => [

    'session' => [
        'class' => '\frontend\components\CustomDbSession',
        // 'db' => 'mydb',  // the application component ID of the DB connection. Defaults to 'db'.
        'sessionTable' => 'session_frontend_user', // session table name. Defaults to 'session'.
    ], 

4)在路径\\ frontend \\ components中创建配置所需的自定义组件'CustomDbSession':

<?php

namespace frontend\components;


use Yii;
use yii\db\Connection;
use yii\db\Query;
use yii\base\InvalidConfigException;
use yii\di\Instance;

class CustomDbSession extends \yii\web\DbSession {

    public $writeCallback = ['\frontend\components\CustomDbSession', 'writeCustomFields'];

    public function writeCustomFields($session) {

        try
        {
            $uid = (\Yii::$app->user->getIdentity(false) == null)?null:\Yii::$app->user->getIdentity(false)->id;
            return [ 'user_id' => $uid, 'ip' => $_SERVER['REMOTE_ADDR'] ];
        }
        catch(Exception $excp)
        {
            \Yii::info(print_r($excp), 'informazioni');


        }
    }


}

没有立即的方法可以确定用户是否处于脱机状态,如果您曾经测试过Facebook自己(和其他站点)的网络,您将很快意识到这一点。

最常见的方式(如果您使用的是Facebook的Chrome网络工具,直到最近,也许仍然如此),就是使用某种隐藏的iframe对服务器产生“心跳”,表明用户仍在。

通常最好不要依赖会话(尤其是如果您使用多种设备类型)来确定用户是否已登录,而是更多地使用来自身份验证源的请求。 这样,我将在用户上存储“立即在线”字段,并在每次执行心跳时ping该字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM