2017-07-28 17 views
0

無脂肪状態の期間(例えば5分間)が過ぎると、fat-freeフレームワークセッションが期限切れになるように設定するにはどうすればよいですか?私のWebアプリケーションは、ユーザーがログアウトするまで開かれたままです。無脂肪フレームワークセッションの終了

答えて

1

まず、PHPセッションgarbage collectorの動作について知る必要があります。デフォルトでは、100回ごとのリクエスト(パフォーマンス目的)ごとにランダムにトリガーし、期限切れのセッションファイル(デフォルト:1440秒)を探して削除します。

また、一部のLinuxディストリビューション(Debianなど)disableがこのガベージコレクタを認識し、それを自分のcronジョブに置き換えていることが必要です。

あなたは、PHPの設定のチェックを開始することができます:GC確率が0である

foreach (['gc_probability','gc_divisor','gc_maxlifetime'] as $k) 
    echo $k,'=',ini_get("session.$k"),'<br>'; 

場合、セッションファイルは、これまでに削除されません(またはDebianの上のcronジョブによって除去することができます)。 0ではなく、低い(例えば1/100)場合、セッションファイルはしばらく削除される(ページを100回リフレッシュしようとする)。

理論上、期限が切れるとすぐにセッションファイルを削除するには、確率を1(gc_probability = gc_divisor = 1)に設定します。これは、トラフィックの少ない小さなアプリケーションでは機能しますが、より大きなアプリケーションではパフォーマンスに影響します(GCがリクエストごとに1000以上のセッションファイルをスキャンする必要があるとします)。

この問題を解決する最もクリーンでポータブルな方法は、セッションを期限切れにすることです。ユーザーセッションデータをロードするたびに、前回のセッションデータを確認し、期限切れの場合はセッションデータを消去します。もちろん

$f3->TIMEOUT=7200;// define session timeout here (in seconds) 
ini_set('session.gc_maxlifetime',$f3->TIMEOUT);// see note (*) below 

$f3->route('GET|POST|DELETE /session',function($f3){ 

    // load session data 
    $data=&$f3->ref('SESSION.data'); 

    // sign in on POST requests 
    if ($f3->VERB==='POST') { 
     $data=['user'=>'John','stamp'=>time()]; 
     $f3->reroute(); 
    } 

    // sign out on DELETE requests 
    if ($f3->VERB==='DELETE') { 
     // sign out 
     $data=NULL; 
     $f3->reroute(); 
    } 

    // check if session has expired 
    if (is_array($data) && time()>$data['stamp']+$f3->TIMEOUT) { 
     $data=NULL; 
    } 

    // check if user is authenticated 
    if (is_array($data)) { 
     echo 'Welcome ',$data['user'],' last time we\'ve seen you was ',date(DATE_W3C,$data['stamp']); 
     echo '<form action="" method="post"><button>Sign out</button><input type="hidden" name="_method" value="DELETE"/></form>'; 
     $data['stamp']=time();// update session stamp 
    } else 
     echo 'You\'re not authenticated'; 
     echo '<form action="" method="post"><button>Authenticate as `John`</button></form>'; 

}); 

は、あなたがより良い専用のクラスでは、このすべてのロジックをラップしたい:

はここで小さな例です。

(*)PHP GC maxlifetimeは$f3->TIMEOUTより小さくしないでください。そうしないと、干渉する可能性があります。 $f3->TIMEOUTが7200、session.gc_maxlifetimeが1440(デフォルト)に設定されているとします。ユーザーセッションが1440〜7200の間で期限切れになる可能性があります。

+0

セッションクッキーの有効期間を制限する方が簡単ではありませんか?すなわち '$ f3-> set( 'JAR.expire'、strtotime( '+ 5分'));' – ikkez

関連する問題