2011-04-27 47 views
1

我一直在對Codeigniter會話庫進行擴展。爲什麼我會從memcached中丟失會話數據?

完整的「包裝」可在github上找到。

我遇到的問題是它似乎在將數據保存到memcache中,但是當它運行以下方法(配置項每隔一段時間更新一次會話數據 - 默認爲5分鐘),它似乎會「丟失」數據。我很確定這是在添加新項目並刪除舊項目的情況下發生的。

function sess_update() { 
     // We only update the session every five minutes by default 
     if (($this->userdata['last_activity'] + $this->sess_time_to_update) >= $this->now) { 
      log_message('info','not enough time before update'); 
      return; 
     } 
     log_message('info','defo need to update session'); 

     // 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)); 
     log_message('info','session id generated'); 
     // Update the session data in the session data array 
     $this->userdata['session_id'] = $new_sessid; 
     $this->userdata['last_activity'] = $this->now; 

     // _set_cookie() will handle this for us if we aren't using database sessions 
     // by pushing all userdata to the cookie. 
     $cookie_data = NULL; 

     $cookie_data = array(); 
     foreach (array('session_id', 'ip_address', 'user_agent', 'last_activity') as $val) { 
      $cookie_data[$val] = $this->userdata[$val]; 
     } 

     switch ($this->session_storage) { 
      case 'database': 
       // Update the session ID and last_activity field in the DB if needed 
       // set cookie explicitly to only have our session data 
       $this->CI->db->query($this->CI->db->update_string($this->sess_table_name, array('last_activity' => $this->now, 'session_id' => $new_sessid), array('session_id' => $old_sessid))); 
       break; 
      case 'memcached':     
       // Add item with new session_id and data to memcached 
       // then delete old memcache item 
       $this->memcache->add('user_session_data' . $new_sessid, $this->userdata, false, $this->sess_expiration); 
       log_message('info', 'new session added'); 
       $this->memcache->delete('user_session_data' . $old_sessid, 0); 
       log_message('info', 'old session deleted');     
       break; 
     } 



     // Write the cookie 
     $this->_set_cookie($cookie_data); 
    } 

有沒有人有任何想法,我哪裏會出錯?

回答

1

如果你想使用內存緩存的會話,最好的方式做這將是直接在php.ini中設置它,並充分利用本機功能優勢:

session.save_handler = memcache 
session.save_path = "tcp://localhost:11211" 
+1

我寧願使用CI的會話處理(它不使用PHP的本機) – 2011-04-27 17:58:22