2012-02-11 34 views
6

我想知道會話是如何在Codeigniter中工作的。閱讀在線手冊,我看到以下內容:Codeigniter中的會話如何工作

如果會話數據不存在(或者已過期),則會創建一個新會話並保存在cookie中。如果會話確實存在,其信息將被更新並且cookie將被更新。每次更新後,會重新生成session_id。

注:會話cookie僅默認爲每五分鐘更新一次,以減少處理器負載。如果您反覆重新載入頁面,您會注意到,如果自上次寫入cookie以來五分鐘或更長時間已過,「最後一次活動」時間只會更新。這個時間可以通過更改system/config/config.php文件中的$ config ['sess_time_to_update']行進行配置。

問題

  1. 什麼信息,如果當會話類頁面加載存在會話更新?這是會話ID存儲在cookie中,還是會話數據本身存儲在數據庫中?
  2. 會話cookie只會每5分鐘更新一次。如果用戶在5分鐘內從頁面A轉到頁面B,這需要添加新的會話數據呢?從邏輯上講,會話數據應該更新,所以我想我錯誤地理解了這一行......在這種情況下,我會猜測會話cookie每5分鐘獲取一個新的會話ID。

任何澄清將有助於!

+0

我還具有混淆。我必須說CI 1.7.2上的一個奇怪的行爲。當我使用數據庫類型會話應用程序工作正常。但在數據庫類型爲false的情況下會使應用程序非常慢。有什麼建議麼? – 2012-10-10 12:27:31

回答

2

是的,是關於存儲在cookie中的會話ID。這是每5分鐘重新生成一次。當重新生成時,首先會獲取當前會話數據,然後將其分配給新的會話ID。從CI會話庫函數sess_update()

代碼:

// Save the old session id so we know which record to 
// update in the database if we need it 
$old_sessid = $this->userdata['session_id']; 
$new_sessid = ''; 
while (strlen($new_sessid) < 32) 
{ 
    $new_sessid .= mt_rand(0, mt_getrandmax()); 
} 

// To make the session ID even more secure we'll combine it with the user's IP 
$new_sessid .= $this->CI->input->ip_address(); 

// Turn it into a hash 
$new_sessid = md5(uniqid($new_sessid, TRUE)); 

// Update the session data in the session data array 
$this->userdata['session_id'] = $new_sessid; 
$this->userdata['last_activity'] = $this->now; 
+0

真的非常感謝這個有用的信息,所以對於編程的熱愛。 – 2016-08-22 15:17:04