1

在 yii 中,我需要存储用户_login time和 使用会话。logout timetotal duration logged_

我是会话概念的新手。我不知道如何检索total logged time, login time, log out time. 在会话表中它只存储id--expire--data

我存储会话的代码是

protected/config/main.php

            'components'=>array(

    'session'=>array(
            'class' => 'CDbHttpSession',

            'connectionID' => 'db',
            'sessionTableName' => 'dbsession',
        ),
    ),

一切正常,但存储在 db 中的数据已加密。所以我无法检索我需要的数据。另一件事是什么数据存储在会话表中。

我在没有会话的情况下使用的替代方式,但也有问题。我用它来获取login time,logout timetotal duration logged

我使用了带有字段的表活动

id,username,user_activity,url,ip,time 

用户登录和注销时在表格中填写数据的代码如下

protected/controller/sitecontrollers.php

         public function actionLogin()
        {
                /* log in */

                $model=new LoginForm;

                // if it is ajax validation request
                if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
                {
                        echo CActiveForm::validate($model);
                        Yii::app()->end();
                }

                // collect user input data
                if(isset($_POST['LoginForm']))
                {
                        $model->attributes=$_POST['LoginForm'];
                        // validate user input and redirect to the previous page if valid
                        if($model->validate() && $model->login())                                                                               
                               {
                                $activity = new Activity;
                                $activity->username = Yii::app()->user->id;                          
                                //$activity->userId = Yii::app()->user->id;
                                $activity->user_activity = "1";
                $activity->url=$_SERVER['HTTP_REFERER'];
                $activity->ip=$_SERVER['REMOTE_ADDR'];
                                // This breaks the site when log in details are wrong
                                $activity->save();
                                if($activity->save())
                                $this->redirect(Yii::app()->homeUrl);
                    }                          


                }

                // display the login form
      if(Yii::app()->user->id==null)
      {
                  $this->render('login',array('model'=>$model));
      }
         else
           {
         throw new CHttpException(404,'User already logged in.');
             }
        }

        /**
         * Logs out the current user and redirect to homepage.
         */
       public function actionLogout()
        {


                // log
                $activity = new Activity;
                $activity->username = Yii::app()->user->id;
                $activity->user_activity = "0";
        $activity->url=$_SERVER['HTTP_REFERER'];
        $activity->ip=$_SERVER['REMOTE_ADDR'];
                $activity->save();      


                Yii::app()->user->logout();   
                                if($activity->save())                                  

                $this->redirect(Yii::app()->homeUrl);
        }

以这种方式一切正常,但是当浏览器关闭时,应用程序被注销并且数据没有进入数据库。那么持续时间的计算就会出错。所以只有我参加了方法会话但不知道如何使用。

4

1 回答 1

4

我认为你永远不会正确地做这种事情,但会犯一些错误(或多或少几分钟,取决于你的需要)。

1. 通过页面请求保持活力

您可以将活动状态发送到您的 ajax 页面actionImAlive,而且您更经常这样做,更准确地说,您会知道用户会话有多长时间。如果你在 5 分钟内做1 次活的事情,你将有大约 5 分钟错误的持续时间。

  1. 添加列 t_login、t_last_activity
  2. 在用户登录更新 t_login 和 t_last_activity 与当前时间戳
  3. 在每个用户新页面加载时检查是否需要更新 t_last_activity

    主控制器 *(components/Controller.php)

    public function keepAlive( ) {
            User::model()->updateByPk( 
                Yii::app()->user->id, 
               // array('t_last_activity' => 'NOW()') //CURRENT_TIMESTAMP
             array('t_last_activity' => new CDbExpression('NOW()')) //CURRENT_TIMESTAMP..this working fine 
        );
    }
    
    // Runs after any action in controller
    public function afterAction($action) {
        self::keepAlive();
        parent::afterAction($action);
    }
    
    // This action can be reached by ajax every 5min 
    // if user stays in one page long enaugh
    // (write javascript..)
    public function actionImAlive() {
        self::keepAlive();
    }
    
  4. 每次用户加载新页面时,上面的代码都会更新 t_last_activity,但您可以通过在用户会话中保存上次活动时间图并在执行 keepAlive() 函数之前检查它每 5 分钟执行一次

    其他控制器

    所有其他控制器都使用 Controller 类作为父级

    SiteController extends Controller
    MyController extends Controller
    SomeController extends Controller
    

2. 仅用于用户显示(计算从登录时间到现在的持续时间now() - t_login:)

如果您想向用户显示此会话持续时间(我不知道为什么要这样做,但无论如何..)您可以将t_login列添加到用户表并即时计算持续时间。

这些是我的头等大事。

于 2012-04-26T10:04:37.093 回答