Comment mettre en cache le résultat de db_query ()?

9

Je views_get_view_result()pour obtenir des résultats d'une vue parce qu'il était pratique à ce moment - là. Le résultat de la requête change rarement; Je pourrais utiliser la mise en cache des vues pendant 6 jours.

Si je voulais le convertir en appel, db_query()comment pourrais-je activer la mise en cache?

uwe
la source

Réponses:

9

N'importe pas pour la mise en cache si vous utilisez des vues ou db_query (). La mise en cache fonctionne toujours de la même manière, la façon dont les données sont récupérées lorsque le cache manque est à votre entière discrétion.

  1. Créez un ID de cache pour identifier votre entrée de cache. Peut être une chaîne simple et codée en dur ou quelque chose de complexe basé sur des arguments, etc.
  2. Vérifiez si vous pouvez charger à partir du cache.
  3. Sinon, reconstruisez les données et placez-les dans le cache avec le délai d'expiration souhaité.

Pour voir quelques exemples, vous pouvez regarder les fonctions qui utilisent cache_get () , par exemple variable_initialize () .

Si votre fonction est appelée plusieurs fois, vous souhaiterez probablement la combiner avec un cache statique, voir par exemple archiver_get_info () . Et si la reconstruction des données est vraiment lente, vous pouvez l'empêcher de se produire plusieurs fois en utilisant le cadre de verrouillage comme le fait variable_initialize ().

Notez que la mise en cache d'une seule requête n'a de sens que si elle est lente, car un cache_get () est également une requête db à moins que vous n'utilisiez un backend de cache alternatif comme Memcache.

Enfin, Views a une mise en cache déjà intégrée et peut être configurée dans votre vue. Cela pourrait donc aussi être une option.

Berdir
la source
Battez-moi;) Je vais laisser ma réponse comme un exemple de code, mais ce sont des informations beaucoup plus utiles
Clive
Je pensais que les instances PDO n'étaient pas sérialisables?
mpdonadio
1
Non, ils ne le sont pas, mais ce n'est pas pertinent. Vous ne mettez pas en cache la ressource de résultat pdo, vous mettez en cache toutes les structures de données que vous récupérez réellement à partir de cette requête.
Berdir
Je dirais que c'est très pertinent. @MotoTribe posait des questions sur la mise en cache des résultats de db_query(), et avoir à mettre en cache la valeur de $results->fetchAll()et non $resultsest la clé pour que cela fonctionne réellement.
mpdonadio
7

Je ne pense pas que la couche DB ait un mécanisme de mise en cache intégré (bien que je puisse me tromper), mais vous pouvez utiliser l'API de cache par défaut.

Ceci est juste un exemple de base qui mettra en cache les résultats d'une requête pour obtenir des nœuds d'un certain type:

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
la source
3

En plus du mécanisme cache_set / cache_get standard fourni par Drupal, si vous utilisez MySQL comme base de données, vous pouvez activer le cache de requêtes , qui peut mettre en cache les résultats des vues ou toute autre requête de base de données de manière transparente. mysqltuner peut aider à trouver de bonnes valeurs pour la taille du cache.

Notez simplement que si vous écrivez beaucoup dans la base de données, la mise en cache des requêtes devient moins efficace en raison du fonctionnement de la stratégie d'invalidation du cache (une écriture dans une table invalide toutes les entrées qui SELECTIONNENT OU JOIGNENT à cette table).

Il existe également un mécanisme de mise en cache pour PostgreSQL , mais je n'ai pas d'expérience directe avec lui.

mpdonadio
la source
3

J'ai récemment découvert le module Actions de cache . Avec ce module, vous pouvez définir la mise en cache de votre vue sur Cache déclenché par des règles et créer une règle pour invalider le cache sur des vues et des affichages spécifiques.

Par exemple, le cache d'une vue qui répertorie les nœuds d'un type de contenu spécifique peut être vidé lorsqu'un nouveau nœud est créé de ce type de contenu.

weekbeforenext
la source