Frage

Im eine Datenbank-Klasse in PHP zu tun, und ich will Cache des Ergebnisses der querys in einem assoziativen Array machen, ist meine Idee, die SQL-Anweisung als der Index des Cache-Array zu verwenden, ist es eine gute Idee sein könnte? oder soll ich eine md5 aus der SQL?

class DB{
const HOST = 'localhost'; //Your Database Host!
const USER = 'user'; //Your Database Username!
const PASSWORD = 'pass'; //Your Database Password!
const DATABASE = 'database'; //Your Database Name!

private static $Instance;
private static $cache = array();

private function __construct(){
    self::$Instance = mysql_connect(self::HOST, self::USER, self::PASSWORD) or die("Could not connect to database server<br/><b>Error:</b>".mysql_error());
    mysql_select_db(self::DATABASE) or die("Could not connect to database<br/><b>Error:</b>".mysql_error());
    return self::$Instance;
}

public static function DB(){
    if(!isset(self::$Instance)){
      $c = __CLASS__; 
      new $c(); 
    }
    return self::$Instance;
}

public static function QueryUnique($query){
    $query = "$query LIMIT 1";
    //$h = md5($query);
    $h = $query;
    if(isset(self::$cache[$h]))return self::$cache[$h];

    $result = mysql_query($query, self::DB());
    self::$cache[$h] = mysql_fetch_array($result);
    return self::$cache[$h];
}

}

Guten Tag

War es hilfreich?

Lösung

Bevor Sie sich zu weit über die Implementierung zu erhalten, sollten Sie diese

Andere Tipps

Caching von MySQL-Daten könnte ein wenig riskant sein, es eine Menge von Annahmen über die Dinge macht, aber gesagt hat, dass ein MD5-Prüfsumme der SQL-Zeichenfolge ist eine gute Möglichkeit, eine ID für Ihre Cache-Daten zu erzeugen, jedoch werden Sie brauchen die sQL erster, zum Beispiel zu normalisieren:

'select 1+2'
'select 1 + 2'
' select 1 +2'

jeder wird eine andere Prüfsumme geben, werden Sie sicher, dass zwischen der gleichen Abfrage alle kleine Unterschiede machen müssen gesorgt.

Es sollte keine große Auswirkung sein, abgesehen von einer wenig mehr Speichernutzung, aber im Vergleich zum Ergebnis der Abfrage, ich glaube nicht, dass es ein Problem sein.

Assoziative Arrays sind Karten bestellt, so den richtigen Index zu finden, sollte durch die Gesamtlänge der Saite nicht zu sehr beeinträchtigt werden. Der einzige Nachteil wäre, dass die meisten Saiten mit dem exakt gleichen Text beginnen.

Ich würde nicht darauf verlassen, nur ein MD5-Hash für Ihre Fragen. Es ist möglich (wenn unwahrscheinlich ist), dass eine Hash-Kollision auftreten würde, und es wäre ein ganz anderes Abfrageergebnis auswählen. Es könnte jedoch ein akzeptables Risiko für Ihre Anwendung sein.

Persönlich würde ich dies überhaupt auf Abfrageebene nicht. Die Cache-Fähigkeit hängt in der Regel von der Art der Daten zurückgegeben. Wenn Sie auf dieser Ebene zwischenzuspeichern, würde Ihre Anwendung sein völlig agnostisch, was es ist Caching.

Ein Hash (MD5, SHA1) essen weniger Speicherplatz.

Wenn die Abfrage ziemlich lang ist, würde ich für die Verwendung von einer Art von Hash gehen (wie md5):

  • wird es wahrscheinlich ein bisschen weniger Speicher (nicht relevant, nehme ich an)
  • es erlaubt Sie, dass in einer anderen Art von Cache zu speichern, wie Datei oder APC oder Memcached oder was auch immer, ohne den Index zu ändern.

In Anbetracht der geringen Risiken von Kollisionen mit md5, ist es nicht „gefährlich“ scheinen das zu tun.

Das einzige Problem, das ich sehe, ist es schwieriger, vielleicht bekommen Sie Ihre Daten im Cache zu finden, wenn das Debuggen, sei es mit var_dump oder jeder Art von „echten“ Debugger: - (

scroll top