1

yii では、users と Using session を保存する必要が_login timeありlogout timeますtotal 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 に保存されているデータは暗号化されています。そのため、必要なデータを取得できません。もう 1 つ、セッション テーブルに格納されているデータについて説明します。

セッションなしで使用した別の方法ですが、それにも問題があります。を取得するためにこれを使用しlogin timelogout 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 を更新しますが、最後のアクティビティの timestmap をユーザー セッションに保存し、keepAlive() 関数を実行する前に確認することで、5 分ごとに更新できます。

    その他のコントローラー

    他のすべてのコントローラは Controller クラスを親として使用します

    SiteController extends Controller
    MyController extends Controller
    SomeController extends Controller
    

2. ユーザー表示のみ (ログイン時から現在までの期間を計算: now() - t_login)

このセッション期間をユーザーに表示したい場合 (なぜこれを行う必要があるのか​​ わかりませんが、とにかく..)、t_login列をユーザーテーブルに追加して、その場で期間を計算することができます。

これらは私の頭の上でした。

于 2012-04-26T10:04:37.093 に答える