2010-12-12 97 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升级到较高版本 - 此破解将会丢失。