2011-10-20 81 views
2

這不是session_set_cookie_params或session.gc_maxlifetime的普通問題。我挖谷歌,我什麼都不理解。控制PHP會話超時,每次點擊重置計數器

的情況是相當普遍和往常一樣:我希望用戶會話保持,只要「點擊之間」時期是不到十分鐘的工作,即便留在工作了幾個小時。

我在每個請求做的是以下幾點:

session_name('session_cookie_name'); 
session_set_cookie_params(600, '/'); // 600 is how much seconds in a ten minutes. 
session_cache_limiter(FALSE); 
session_start(); 

而且我希望我上面提到的,考慮到的session.gc_maxlifetime設置爲默認值的結果,1440

編輯:

我得到的是,每600秒我得到一個新的會話,沒有數據 保存從prevous請求。

是做什麼用的約定來實現這一目標?

+0

可能重複的[如何更改PHP中的會話超時?](http://stackoverflow.com/questions/8311320/how-to-change-the-session-timeout-in-php) – rahmanisback

回答

2

使用setcookie,設置cookie與PHP設置與在session_start相同的參數:

  1. 相同會話cookie的名字(PHP默認爲PHPSESSID
  2. 相同的會話ID,通過session_id()
  3. 所獲得的新過期值(在這種情況下爲time() + $lifetime
  4. 相同路徑(如「/」)和域(通常爲$_SERVER['HTTP_HOST']
3

那麼,您的當前解決方案無法保證會話將嚴格按照定義通過10分鐘後由GC收集。

更好的解決方案是使用默認會話壽命時間(20分鐘以上),手動處理點擊之間超時。

只是存儲$_SESSION['last_click_time'] = time();並進行比較。如果600秒以上通過 - 你需要什麼:刷新會話,註銷用戶,創建日誌記錄,電子郵件的人,等等。

+0

謝謝。但是,不,我確實想延遲GC,因爲我將cookie的生存期設置爲0.我希望GC在它在新會話的情況下保持活動的時間段之後運行。我怎麼能夠?我應該重新生成會話ID嗎? – rahmanisback

+0

@rahmanisback:GC不準確地按時**調用**。任何**真實**的理由不遵循我的建議? – zerkms

+0

忽略GC概率,這將導致GC在20分鐘後運行會話數據。我想讓用戶繼續工作數小時或數天。你是否想要將session.gc_maxlifetime設置爲非常高的值? – rahmanisback

0
$cur_time = time(); 
if($cur_time > $_SESSION['timeout']){ 
//destroy the session (reset) 
session_destroy(); 
}else{ 
    //set new time 
    $_SESSION['timeout'] = time() + 600; 
} 

這是我會怎麼做。

+0

並且您將設置session.gc_maxlifetime? – rahmanisback