2010-12-12 5 views
6

Ich entwickle eine Website (mit einem Einkaufswagen) über Codeigniter und möchten die sess_use_database Einstellung verwenden, um es für Benutzer schwieriger zu machen, einen Einkaufswagen zu hacken Session.Codeigniter - wie Datenbankzwischenspeicherung für Sitzungen zu vermeiden

Ich möchte auch Datenbank-Caching verwenden gemeinsamen DB-Anfragen zu beschleunigen (wie ‚Kategorien erhalten‘, wie der größte Teil des DB-Inhalt wird nicht regelmäßig ändern), so habe ich diese Einstellung aktiviert:

$db['development']['cache_on'] = TRUE; 
//where 'development' is my environment 

Als Ergebnis ich finde, dass die Sitzung Inhalte nicht aktualisiert werden, zum Beispiel auf diese Anfrage:

$this->basket_contents = array_values($this->session->userdata('basket_contents')); 

auch ich habe dies versucht:

$this->db->cache_off(); 

... vor der Sitzungsanfrage, aber es löst das Problem nicht (ich nehme an, weil es keine direkte DB-Anfrage ist).

Meine Sitzung setings sind wie folgt:

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

Kann ich verhindern, dass das Caching von sitzungsbezogenen DB-Anfragen? Oder verhindern, dass bestimmte Tabellen zwischengespeichert werden?

ODER gibt es eine andere (wahrscheinlich offensichtliche) Lösung, an die ich nicht gedacht habe?

Vielen Dank im Voraus.

Antwort

3

In CodeIgniter ist das Caching eine Alles-oder-Nichts-Lösung, die Sie nicht für einzelne Tabellen aktivieren können.

Es gibt zwei Optionen, die ich denken kann:

  • nicht CIs generic-Caching, verwenden aber einen Cache-Bibliothek wie http://philsturgeon.co.uk/code/codeigniter-cache
  • Hack db_driver.php verwenden. In Zeile 265 (CI 1.7.2) wird überprüft, ob das Caching aktiviert ist. Ändern Sie diese Zeile so, dass sie es nicht tut, wenn es sich um eine SELECT-Anweisung in der Sitzungstabelle handelt.
+0

Großartig, danke. Ich fange mit der ersten Option an. – Ade

1

In Version bis 2.2.1 es einfache Lösung sein könnte:

in Dateisystem/Bibliotheken/Session.php

find Linie mit Zeichenfolge „$ query = $ this-> CI-> db-> get ($ this-> sess_table_name); "

  1. vor der Zeile hinzu:

    // saving cache_on 
    $cache_on = $this->CI->db->cache_on; 
    $this->CI->db->cache_on = false; 
    
  2. nach der Zeile hinzu:

    // restoring cache_on 
    $this->CI->db->cache_on = $cache_on; 
    

Dies wird mysql-Caching für diese genaue Sitzung Abfrage, so dass Ihre Cache-Logik verhindern wie es ist.

Beachten Sie, dass diese Änderung betrifft Framework-Systemdatei, also, wenn Sie CI auf höhere Version aktualisieren - dieser Hack wird verloren gehen.