Codeigniter - как избежать кеширования базы данных для сессий - PullRequest
6 голосов
/ 13 декабря 2010

Я занимаюсь разработкой веб-сайта (с корзиной для покупок) поверх 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;

Можно ли предотвратить кэширование связанных с сеансом запросов к БД? Или запретить кэширование определенных таблиц?

ИЛИ есть другое (вероятно, очевидное) решение, о котором я не думал?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 13 декабря 2010

В CodeIgniter кэширование является решением "все или ничего", вы не можете включить его для отдельных таблиц.

Есть два варианта, которые я могу придумать:

  • donНе используйте общее кэширование CI, но используйте библиотеку кэша, такую ​​как http://philsturgeon.co.uk/code/codeigniter-cache
  • hack db_driver.php.В строке 265 (CI 1.7.2) проверяется, включено ли кэширование.Измените эту строку, чтобы она не делала этого, когда это SELECT в таблице сеансов.
1 голос
/ 16 марта 2015

В версии до 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 до более ранней версии - этот хак будет потерян.

...