2013-07-03 35 views
0

通常情況下,網站會向用戶提供選擇以記住他的登錄信息,因此它會將Cookie生存期設置爲零或第一次會話開始時爲X.在PHP中設置會話持續時間的正確方法是什麼?

要記住這個選擇,我把生命週期值放在$ _SESSION var。但是當我想要繼續會話時,我無法在會話開始前檢索此值,並且如果我想調用session_set_cookie_params(),我必須先執行此操作。

所以目前我做不是當我繼續會話時調用session_set_cookie_params()。相反,我保存會話開始時的當前時間,並在會話繼續時檢查它。這是代碼(注:這是一個簡化版本,原代碼具有所有其他需要的東西,如session_register_shutdown()):

// when I start the session 

[...] 

session_set_cookie_params($duration); // $duration was set before 
session_start();  
$_SESSION['starttime'] = time(); 
$_SESSION['duration'] = $duration; 


//----------------------------------- 
// when I continue the session 


$ok = true; 

session_start(); 

if (isset($_SESSION['starttime'])) 
{ 
    $elapsed = $_SESSION['starttime']; - time(); 
    $duration = $_SESSION['duration']; 
    if ($elapsed >= $duration and $duration !== 0) 
    { 
     $ok = false; 
    } 
} 
else 
{ 
    $ok = false; 
} 

if (! $ok) 
{ 
    // destroy the session 
} 

這是正確的嗎?如果不是,爲什麼還有更聰明的方法來處理會話持續時間?

回答

1

設置cookie的生命不是你所要做的唯一的事情,你也必須設置session.max_lifetime - 這是不正確的命名,其實是一個分鐘一生,是要在會話上次訪問後通過文件,在允許垃圾收集器從磁盤清除它之前。

根本不應該使用會話機制本身。相反,請設置您自己的cookie,以便您可以再次識別登錄的用戶 - f.e.包含用戶名或ID,以及用戶獨有的東西用祕密鹽進行散列。如果您收到該cookie值(並已驗證),並且您的會話中沒有已登錄的用戶 - 將它們記錄下來,加載所有必要的數據以放入會話中,等等。

+0

我會加倍投票如果可以的話,我會比一次。 – Jon

+0

嗯,這並不回答「爲什麼」:)爲什麼我不應該使用會話機制? –

+1

因爲:-)首先,因爲會話文件的生命週期,你將不得不增加(很多) - 因此比平常多的會話文件將會累積。然後這些文件中會有很多數據(可能是?),其中大部分數據不需要存儲在那裏,而用戶在頁面上不活動。 – CBroe

相關問題