2010-12-12 89 views
6

我正在Codeigniter上開發一個網站(使用購物車),並且想要使用sess_use_database設置,以使用戶更難以破解購物車會話。Codeigniter - 如何避免會話的數據庫緩存

我也想用數據庫高速緩存來加快公共DB請求(如「獲取類」,因爲大多數DB內容不會定期更換),所以我已經啓用此設置:

$db['development']['cache_on'] = TRUE; 
//where 'development' is my environment 

結果,我發現會議內容未在此請求被刷新,例如:

$this->basket_contents = array_values($this->session->userdata('basket_contents')); 

而且,我已經試過這樣:

$this->db->cache_off(); 

...在會話請求之前,但它不能解決問題(我假設,因爲它不是直接的DB請求)。

我會setings如下:

$config['sess_cookie_name']  = 'str_session'; 
$config['sess_expiration']  = 7200; 
$config['sess_encrypt_cookie'] = FALSE; 
$config['sess_use_database'] = TRUE; 
$config['sess_table_name']  = 'ci_sessions'; 
$config['sess_match_ip']  = FALSE; 
$config['sess_match_useragent'] = TRUE; 
$config['sess_time_to_update'] = 300; 

我可以防止會話相關的數據庫請求的緩存?或者阻止某些表被緩存?

或者有沒有想過的另一個(可能很明顯)的解決方案?

在此先感謝。

回答

3

在CodeIgniter中,緩存是一個全有或全無的解決方案,您無法爲單個表啓用它。

有兩種選擇,我能想到的:

  • 不使用CI的通用緩存,但使用緩存庫一樣http://philsturgeon.co.uk/code/codeigniter-cache
  • 黑客db_driver.php。在第265行(CI 1.7.2),它檢查是否啓用了緩存。修改該行,以便在會話表上使用SELECT時不會執行此操作。
+0

太好了,謝謝。我將從第一個選項開始。 – Ade 2010-12-13 23:52:21

1

版本升級到2.2.1有可能是簡單的解決辦法:用繩子「

文件系統/庫

/session.php文件

行查找$查詢= $這個 - > CI-> DB->獲得($這個 - > sess_table_name);」

  1. 行認沽前:

    // saving cache_on 
    $cache_on = $this->CI->db->cache_on; 
    $this->CI->db->cache_on = false; 
    
  2. 行認沽後:

    // restoring cache_on 
    $this->CI->db->cache_on = $cache_on; 
    

這將防止MySQL的緩存這個確切會話查詢,讓你的緩存邏輯就這樣。

請注意,此編輯涉及到框架系統文件,因此如果將CI升級到較高版本 - 此破解將會丟失。