2017-02-27 20 views
0

私は現在、Laravel(5.3)上にアプリケーションを作成しており、ログインしているすべてのユーザーの一覧が必要です。私はもともとそれらをMySQLに格納しようとしていましたが、Redisがその仕事のためにより良いとアドバイスされました。 Redisのドキュメントを見ると、すべてのユーザーを1組にして保存するつもりだったが、個々のメンバーの有効期限を設定することができず、代わりに名前空間の文字列が選択されていた。LaravelとRedisにログインしているすべてのユーザーを一覧表示するには?

私は正しく機能していると信じているコードを書いていますが、それを改善するためのアドバイスがあります。

だからまず、ここで私はLoginController.php

に追加した2つの機能
// Overriding the authenticated method from Illuminate\Foundation\Auth\AuthenticatesUsers 
protected function authenticated(Request $request, $user) 
{ 
    $id = $user->id; 

    // Getting the expiration from the session config file. Converting to seconds 
    $expire = config('session.lifetime') * 60; 

    // Setting redis using id as namespace and value 
    Redis::SET('users:'.$id,$id); 
    Redis::EXPIRE('users:'.$id,$expire); 
} 

//Overriding the logout method from Illuminate\Foundation\Auth\AuthenticatesUsers 
public function logout(Request $request) 
{ 
    // Deleting user from redis database when they log out 
    $id = Auth::user()->id; 
    Redis::DEL('users:'.$id); 

    $this->guard()->logout(); 

    $request->session()->flush(); 

    $request->session()->regenerate(); 

    return redirect('/'); 
} 

次がある私は、ミドルウェアと呼ばれる書いた「RefreshRedis」Redisの上の有効期限を更新するために、ユーザが自分をリフレッシュする何かをするときセッション。

public function handle($request, Closure $next) 
{ 
    //refreshing the expiration of users key 
    if(Auth::check()){ 
     $id = Auth::user()->id; 
     $expire = config('session.lifetime') * 60; 
     Redis::EXPIRE('users:'.$id,$expire); 
    } 
    return $next($request); 
} 

は、私はその後、私はthisスレッドで見つかった機能の修正版を使用するすべてのユーザーの一覧を取得するためには、単にのstartSessionミドルウェア

protected $middlewareGroups = [ 
    'web' => [ 
     \App\Http\Middleware\EncryptCookies::class, 
     \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 
     \Illuminate\Session\Middleware\StartSession::class, 
     \App\Http\Middleware\RefreshRedis::class, 
     \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
     \App\Http\Middleware\VerifyCsrfToken::class, 
     \Illuminate\Routing\Middleware\SubstituteBindings::class, 
    ], 

    'api' => [ 
     'throttle:60,1', 
     'bindings', 
    ], 
]; 

後$ middlewareGroupsでミドルウェアを登録しました。

+0

ユーザーのセッションの有効期限が切れると、自動的にログインが失効します。したがって、このロジックを実装する理由はありません。 これを 'config/session.php'で' 'lifetime '=> 120'に設定することができます。デフォルトは2時間です – WebKenth

+0

待機中、このロジックなしで現在ログインしているすべてのユーザのリストを取得するには? – Dalek

+0

アクティブユーザーのリストを作成することはできませんが、体験学習ロジックを書く必要はないと言っているだけではありません。ユーザーがログインするときにユーザーを追加するだけで、セッションが終了したときにユーザーを削除するだけで、いつでもリストを照会してアクティブユーザーになることができます。 – WebKenth

答えて

1

[実行]コマンドを使用して特定のRedisコマンドを終了する[マルチ]コマンドを使用して、Redisの設定キーを期限切れにすることができます。

protected function authenticated(Request $request, $user) 
{ 
    $id = $user->id; 

    // Getting the expiration from the session config file. Converting  to seconds 
    $expire = config('session.lifetime') * 60; 

    // In using the [multi] and [exec] command 
    $oLibRedis = $this->callRedisLibrary(); // Initialize your Predis\Client class on this method 
    $oLibRedis->multi(); 
    $oLibRedis->set('users:'.$id, $id); 
    $oLibRedis->expire('users:'.$id, $expire); 
    $oLibRedis->get('users:'.$id); 
    $aResults = $oLibRedis->exec(); 
    return $aResults 
} 

ffを生成する。結果は

array(3){[0] =>オブジェクト(Predis \ Response \ Status)#224(1){["ペイロード": "Predis \ Response \ Status":プライベート] =>

結果は、あなたがどのようなコマンドを実行したかに基づいて配列として表示されます(2) "OK"} [1] => int(1)[2]遠いRedis(例えば、設定、期限切れ、コマンド取得)

セッションが期限切れになっているかどうかをチェックしたいときは、 Redisでは[ttl]コマンドを使用できます。

$sRedisUserKey = $oLibRedis->ttl($sSampleUserKey); // int(7184) 

ページを更新してカウントダウンを確認してください。これがあなたに役立つことを願っています

関連する問題