2016-01-06 2 views
1

Я хочу рассчитать всех пользователей онлайн в своем приложении Yii 2, каково ваше решение?счетчик онлайн-пользователей Yii2

Даже я хочу считать аутентифицированных пользователей. одним из решений является использование метода аутентификации при входе в систему и после входа в систему я установил запись в db. но здесь у меня проблема. Как определить, когда пользователь отключен? Если я изменяю онлайн-флаг при выходе из системы, у него есть некоторые проблемы. возможно, некоторые пользователи закрывают браузер без входа в систему. то база данных покажет его онлайн. Какое лучшее решение для этой проблемы?

Редактировать

Мой вопрос заключается в том, чтобы в течение езды сессии истекает метод. Не изменять срок действия. Более подробно, я хочу определить, находится ли пользователь в автономном режиме, даже если он закрывает браузер без выхода из системы.

+0

Какова ваша продолжительность истечения срока действия вашей сессии, может ли она использоваться для неактивного другого, кто закрыл браузер ??? –

+0

Да, это мудрое решение. но как преодолеть метод истечения срока действия сеанса? –

+0

попробуйте это @behzad http://stackoverflow.com/questions/12859333/yii-users-being-logged-out-after-15-30-minutes-despite-session-timeouts-being-se –

ответ

3

Вы можете хранить сеансы в базе данных, и инфраструктура будет обрабатывать вас.

Этот пример выполнен из расширенного шаблона, и у меня есть сеанс от пользователей внешнего интерфейса.

Мне нужно было создать и использовать пользовательский компонент для хранения идентификатора пользователя.

1) Создание таблицы на дб:

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) изменение конфигурации в конфигурации/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) Создайте пользовательский компонент CustomDbSession, необходимый для конфигурации в пути \ frontend \ components:

<?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'); 


     } 
    } 


} 
+0

идеальное решение для авто чистка мы можем использовать ajax через определенные промежутки времени;) –

+0

каркас делает автоматическую уборку –

+0

после истечения срока годности? –

2

Нет немедленного способа определить, что пользователь находится в автономном режиме, если вы когда-либо проверяли собственный (и другой сайт) Facebook, вы это быстро поймете.

Наиболее распространенный способ (если вы посмотрите в веб-инструментах Chrome для Facebook, которые все еще делали это до недавнего времени, возможно, все еще), следует использовать скрытый iframe, чтобы произвести «сердечный ритм» на сервер, который говорит, что пользователь все еще там.

Обычно лучше не полагаться на сеансы (особенно если вы используете несколько типов устройств) для того, зарегистрирован ли пользователь, но больше из источника с проверкой подлинности. Таким образом, я буду хранить поле «онлайн сейчас» у пользователя и пинг этого поля каждый раз, когда вы делаете сердечный ритм.

+0

Спасибо за ваш ответ –

Смежные вопросы