it-swarm.com.de

Wie kann ich das Ergebnis von db_query () zwischenspeichern?

Ich habe views_get_view_result() verwendet, um Ergebnisse aus einer Ansicht zu erhalten, da dies zu diesem Zeitpunkt praktisch war. Das Abfrageergebnis ändert sich selten. Ich könnte Viewing Caching für 6 Tage verwenden.

Wenn ich es in einen Aufruf von db_query() konvertieren wollte, wie könnte ich das Caching aktivieren?

9
uwe

Ist für das Caching nicht wichtig, wenn Sie Ansichten oder db_query () verwenden. Das Caching funktioniert immer gleich. Wie die Daten abgerufen werden, wenn der Cache fehlt, liegt ganz bei Ihnen.

  1. Erstellen Sie eine Cache-ID, um Ihren Cache-Eintrag zu identifizieren. Kann eine einfache, fest codierte Zeichenfolge oder etwas Komplexes sein, das auf Argumenten usw. basiert.
  2. Überprüfen Sie, ob aus dem Cache geladen werden kann.
  3. Wenn nicht, erstellen Sie die Daten neu und legen Sie sie mit der gewünschten Ablaufzeit im Cache ab.

Um einige Beispiele zu sehen, können Sie sich die Funktionen ansehen, die cache_get () verwenden, zum Beispiel variable_initialize () .

Wenn Ihre Funktion mehrmals aufgerufen wird, möchten Sie sie wahrscheinlich mit einem statischen Cache kombinieren, siehe zum Beispiel archiver_get_info () . Und wenn die Datenwiederherstellung sehr langsam ist, können Sie verhindern, dass sie mehrmals ausgeführt wird, indem Sie das Sperrframework wie variable_initialize () verwenden.

Beachten Sie, dass das Zwischenspeichern einer einzelnen Abfrage nur dann sinnvoll ist, wenn es sich um eine langsame Abfrage handelt, da cache_get () auch eine Datenbankabfrage ist, es sei denn, Sie verwenden ein alternatives Cache-Backend wie Memcache.

Und schließlich ist in Views bereits Caching integriert, das in Ihrer Ansicht konfiguriert werden kann. Das könnte also auch eine Option sein.

9
Berdir

Ich glaube nicht, dass die DB-Schicht einen eingebauten Caching-Mechanismus hat (obwohl ich mich möglicherweise irre), aber Sie könnten die Standard-Cache-API verwenden.

Dies ist nur ein einfaches Beispiel, mit dem die Ergebnisse einer Abfrage zwischengespeichert werden, um Knoten eines bestimmten Typs abzurufen:

function MYMODULE_get_nodes_by_type($type) {
  // Setup a cache ID
  $cid = 'MYMODULE:node_types:' . $type;

  // If a cached entry exists, return it
  if ($cached = cache_get($cid)) {
    return $cached->data;
  }

  // Otherwise load the data
  $data = db_query('SELECT * FROM {node} WHERE type = :type', array(':type' => $type))->fetchAll();

  // And cache it
  cache_set($cid, $data, 'cache', strtotime('+6 days'));
}
7
Clive

Ich habe kürzlich das Modul Cache Actions entdeckt. Mit diesem Modul können Sie das Zwischenspeichern von Ansichten auf durch Regeln ausgelösten Cache einstellen und eine Regel zum Ungültigmachen des Caches für bestimmte Ansichten und Ansichtsanzeigen erstellen.

Beispielsweise kann der Cache für eine Ansicht, in der Knoten eines bestimmten Inhaltstyps aufgelistet sind, geleert werden, wenn ein neuer Knoten dieses Inhaltstyps erstellt wird.

3
weekbeforenext

Zusätzlich zum Standardmechanismus cache_set / cache_get , den Drupal bietet), wenn Sie MySQL als Datenbank verwenden, können Sie den aktivieren Abfrage-Cache , mit dem die Ergebnisse von Ansichten oder anderen Datenbankabfragen transparent zwischengespeichert werden können. mysqltuner kann dabei helfen, gute Werte für die Cache-Größe zu ermitteln.

Beachten Sie nur, dass das Zwischenspeichern von Abfragen aufgrund der Funktionsweise der Strategie zur Ungültigmachung des Caches weniger effektiv ist, wenn Sie viel in die Datenbank schreiben (ein Schreiben in eine Tabelle macht alle Einträge ungültig, die diese Tabelle SELECT FROM oder JOIN).

Es gibt auch einen Caching-Mechanismus für PostgreSQL , aber ich habe keine direkte Erfahrung damit.

3
mpdonadio