2017-07-28 58 views
0

如何設置一個無脂框架會話在持續時間(例如5分鐘)不活動之後過期?我的網絡應用程序保持打開狀態,直到用戶註銷。無脂框架會話過期

回答

1

首先您需要了解PHP會話garbage collector的行爲。默認情況下,它每100次請求(出於性能目的)隨機觸發,查找過期會話文件(默認:1440s)並將其刪除。

此外,您還需要了解一些Linux發行版(例如Debian)disable這個垃圾收集器並將其替換爲它們自己的cron作業。

你可以開始檢查你的PHP配置:

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

如果GC概率爲0,會議文件永遠不會被刪除(或者可以通過在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

是否更容易限制會話Cookie生存期?即'$ f3-> set('JAR.expire',strtotime('+ 5分鐘'));' – ikkez