6

我正在 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();

...在会话请求之前,但它不能解决问题(我假设因为它不是直接的数据库请求)。

我的会话设置如下:

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

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

或者是否有另一个(可能很明显)我没有想到的解决方案?

提前致谢。

4

2 回答 2

3

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

我能想到的有两种选择:

于 2010-12-13T17:57:31.270 回答
1

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

在文件系统/库/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 将丢失。

于 2015-03-16T12:04:54.700 回答