繁体   English   中英

Codeigniter - 如何避免会话的数据库缓存

[英]Codeigniter – how to avoid database caching for sessions

我正在Codeigniter上开发一个网站(带有购物车),并希望使用sess_use_database设置使用户更难以破解购物车会话。

我还想使用数据库缓存来加速常见的数据库请求(例如'获取类别',因为大多数数据库内容不会定期更改),所以我启用了这个设置:

$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请求)。

我的会话设置如下:

$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;

我可以阻止缓存与会话相关的数据库请求吗? 或者阻止某些表被缓存?

或者是否有另一个(可能是显而易见的)解决方案我没有想过?

提前致谢。

在CodeIgniter中,缓存是一种全有或全无的解决方案,您无法为单个表启用它。

我能想到两个选择:

  • 不要使用CI的通用缓存,但使用像http://philsturgeon.co.uk/code/codeigniter-cache这样的缓存库
  • 破解db_driver.php。 在第265行(CI 1.7.2),它检查是否启用了缓存。 改变该行,这样当它在会话表上的SELECT时就不会这样做。

高达2.2.1的版本中,可能有一个简单的解决方案:

在文件系统/ libraries / Session.php中

查找字符串“$ query = $ this-> CI-> db-> get($ this-> 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升级到较高版本 - 此hack将丢失。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM