6

Codeigniter の上に (ショッピング カートを使用して) Web サイトを開発しています。ユーザーがショッピング カート セッションをハッキングするのをより困難にするためにsess_use_database設定を使用したいと考えています。

また、データベース キャッシュを使用して一般的な 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リクエストではないためだと思います)。

私のセッション設定は次のとおりです。

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

セッション関連の DB リクエストのキャッシュを防止できますか? または、特定のテーブルがキャッシュされないようにしますか?

または、私が考えていなかった別の(おそらく明白な)解決策がありますか?

前もって感謝します。

4

2 に答える 2

3

CodeIgniterでは、キャッシングはオールオアナッシングソリューションであり、個々のテーブルに対して有効にすることはできません。

私が考えることができる2つのオプションがあります:

于 2010-12-13T17:57:31.270 に答える
1

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 を上位バージョンにアップグレードすると、このハックが失われることに注意してください。

于 2015-03-16T12:04:54.700 に答える