Wie kann ich das Ergebnis von db_query () zwischenspeichern?

9

Früher views_get_view_result()habe ich Ergebnisse aus einer Ansicht erhalten, weil es zu dieser Zeit praktisch war. Das Abfrageergebnis ändert sich selten. Ich könnte Viewing Caching für 6 Tage verwenden.

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

uwe
quelle

Antworten:

9

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 , z. B. 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.

Berdir
quelle
Schlagen Sie mich dazu;) Ich werde meine Antwort als Codebeispiel belassen, aber dies ist eine viel nützlichere Information
Clive
Ich dachte, PDO-Instanzen wären nicht serialisierbar?
mpdonadio
1
Nein, das sind sie nicht, aber das ist nicht relevant. Sie speichern die pdo-Ergebnisressource nicht zwischen, sondern zwischen den Datenstrukturen, die Sie tatsächlich aus dieser Abfrage abrufen.
Berdir
Ich würde sagen, dass es sehr relevant ist. @MotoTribe fragte nach dem Zwischenspeichern von Ergebnissen aus db_query(), und das Zwischenspeichern des Werts von $results->fetchAll()und nicht $resultsist der Schlüssel, um ihn tatsächlich zum Laufen zu bringen.
mpdonadio
7

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'));
}
Clive
quelle
3

Neben dem Standard - cache_set / cache_get Mechanismus , dass Drupal bietet, wenn Sie MySQL als Datenbank verwenden, dann können Sie die ermöglichen Abfrage - Cache , der die Ergebnisse der Ansichten cachen können, oder jede andere Datenbankabfragen, transparent. mysqltuner kann dabei helfen, gute Werte für die Cache-Größe herauszufinden.

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

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

mpdonadio
quelle
3

Ich habe kürzlich das Modul Cache-Aktionen 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.

Woche vor dem nächsten
quelle