Cache d'objets partout
WordPress essaie de réduire autant que possible le nombre de requêtes de base de données.
Par exemple, chaque fois que vous obtenez un champ méta ou un champ de taxonomie, avant d'interroger la base de données, WordPress recherche si celui-ci a déjà été interrogé et stocké dans le cache, et le renvoie à partir de là au lieu d'interroger la base de données.
Le "travail de cache" se fait via la WP_Object_Cache
classe et les wp_cache_*
fonctions (qui sont le wrapper des méthodes de cette classe)
Où vit la cache
Par défaut, le "cache" n'est rien de plus qu'une variable globale PHP. Cela signifie qu'il est en mémoire, mais signifie également qu'il disparaît à chaque demande.
Cependant, via des dropins ( advanced-cache.php
et / ou object-cache.php
), il est possible de configurer une manière personnalisée de gérer ce cache.
Habituellement, ces dropins sont utilisés pour configurer une sorte de mécanisme de mise en cache qui "survit" aux demandes singulières.
Pour cette raison, parmi les gens WP, ce sont des plugins "cache persistant" (même si en dehors de la bulle les mots "cache" et "persistant" n'ont pas beaucoup de sens ensemble).
Les choix populaires de nos jours sont Memcached ou Redis .
Ainsi, en utilisant des plugins de "cache persistant", vous pouvez réduire considérablement le nombre de requêtes de base de données, car le cache n'est pas mis à jour à chaque demande.
Quelques exemples
$foo = get_post_meta('foo', $post_id, true);
// a lot of code in the middle
$bar = get_post_meta('bar', $post_id, true);
Les 2 lignes de code ci-dessus déclencheront, au maximum, 1 requête de base de données.
En fait, lorsque vous interrogez un champ personnalisé, tous les champs de cette publication sont récupérés de la base de données, mis en cache via le cache d'objets et les requêtes suivantes extraient les données du cache et non de la base de données.
La même chose se produit pour les termes de taxonomie, WordPress extrait une fois tous les termes d'une taxonomie, puis les renvoie du cache.
Le cache d'objets est très largement utilisé dans WordPress. Non seulement pour les publications, les méta-valeurs et les taxonomies, mais aussi pour les utilisateurs, les commentaires, les données de thème ...
Qu'est-ce que cela WP_Query
a à voir avec tout cela?
Lorsque vous interrogez certains articles via WP_Query
, par défaut, WordPress les extrait non seulement de la base de données (ou du cache s'ils sont mis en cache) mais met également à jour le cache pour tous les champs personnalisés et toutes les taxonomies liées aux articles extraits.
Ainsi, lorsque vous appelez, par exemple, get_the_terms()
ou get_post_meta()
pendant le bouclage de messages WP_Query
, vous ne déclenchez en fait aucune requête de base de données, mais extrayez des informations du cache.
C'est bien, non?
Eh bien, oui, mais cela a un coût.
La mise à jour du cache "magique" que WordPress fait lorsque les messages sont via WP_Query
se produisent update_meta_cache
pour les méta et les update_object_term_cache
taxonomies.
Si vous regardez le code source de ces fonctions, vous verrez que WordPress effectue une seule requête db dans chaque fonction, mais effectue également beaucoup de traitement. Par exemple, update_object_term_cache
il y en a 7 imbriquésforeach
... si vous avez beaucoup de taxonomies, et que le nombre de messages par page est élevé, ce n'est pas très performant.
À propos de ces WP_Query
arguments, enfin
Ce qui est fait 'update_post_meta_cache'
et 'update_post_term_cache'
ce qui est réglé sur false
est d'empêcher WordPress de mettre à jour le cache pour les champs personnalisés et les taxonomies, respectivement.
Dans ce cas, la première fois qu'un champ personnalisé ou une taxonomie est interrogé, une requête de base de données est déclenchée et les données sont mises en cache.
Ça vaut le coup?
Comme d'habitude, la réponse est que cela dépend . La plupart du temps, définir ces valeurs false
est un bon choix, car il empêche le traitement inutile et les requêtes de base de données s'il n'est pas nécessaire, et le cache est mis à jour de toute façon la première fois que des termes de champ / taxonomie personnalisés sont requis.
Cependant, si vous allez appeler, même une fois, get_post_meta()
pendant la boucle et que vous allez appeler get_the_terms()
pour toutes (ou la plupart) des taxonomies prises en charge par les publications, la mise à jour du cache est déclenchée de toute façon, et il pourrait n'y avoir aucun avantage réel sur définissant ces arguments de requête sur false
.
wp_reset_postdata()
est de réinitialiserglobal $post
et de réinitialiser le cache d'objets? Il semble que si je faisais une WP_Query personnalisée, cela créerait un nouvel objet mis en cache, mais sa réinitialisation devrait également requérir pour obtenir le cache d'origine. Ou peut-être que je vais trop loin dans le contexte de cette question.