Que sont les API transitoires?
Publié: 2020-12-16Les performances du site Web tournent souvent autour de l'idée de mise en cache: stocker les données dans un état prêt et plus rapide d'accès, afin qu'elles soient reproduites plus rapidement par les navigateurs. L'API WordPress Transients est un outil de mise en cache et un moyen puissant d'améliorer les performances des sites Web WordPress.
Qu'est-ce que la mise en cache et pourquoi l'utiliser?
Chaque fois qu'un navigateur demande une page Web, le serveur serveur doit effectuer de nombreux calculs complexes et chronophages, ce qui entraîne des retards. Après avoir exécuté une requête, grâce à la technologie de mise en cache, le serveur peut se souvenir du résultat final et sur une deuxième demande, le fournir au navigateur sans avoir à refaire les mêmes calculs. Par conséquent, la possibilité de mettre en cache et de réutiliser des ressources antérieures est essentielle pour optimiser les performances.
La mise en cache tout simplement offre la possibilité de stocker temporairement des informations dans la couche de mise en cache.
Quels sont les types de mise en cache?
Il existe différents types de mise en cache et en utilisant une combinaison d'entre eux, vous obtiendrez un niveau de performance plus élevé.
Mise en cache du navigateur
Avant d'ouvrir le contenu d'une page Web, votre navigateur a besoin d'un certain nombre d'éléments tels que des fichiers JavaScript, des feuilles de style, des polices, etc., qu'il télécharge en plus du contenu de la page.
Si un navigateur met ces fichiers en cache, il ne sera pas nécessaire de les télécharger à chaque fois que vous chargez le site Web. Le chargement du site pour la première fois prend généralement quelques secondes, mais une fois que le navigateur a mis ces fichiers en cache, le temps de chargement est considérablement réduit.
Mise en cache du serveur
La mise en cache du serveur signifie enregistrer le fichier HTML pour une page particulière et l'utiliser pour chaque requête ultérieure. C'est ce que l'on appelle le cache de page complète.
Il existe un autre type de cache de serveur - le cache d'objets, qui, contrairement au cache de page complète, ne met en cache que certains bits (éléments) d'informations.
Mise en cache de page
Considéré comme le cache le plus efficace. Son nom est explicite à la façon dont il fonctionne. Lorsque l'utilisateur «A» visite une page, le site Web la crée et renvoie son contenu au navigateur de l'utilisateur. Lorsque le cache de page est en cours d'exécution, ce contenu de page est enregistré de sorte que lorsque l'utilisateur «B» visite la même page, le cache de page reproduit le contenu précédemment envoyé.
Le plus grand avantage du cache de page est que la page mise en cache revient presque au moment de l'accès. En conséquence, des millions de requêtes sont traitées et les pages sont reproduites même sur le serveur le plus faible avec la vitesse de mémoire la plus faible et une faible utilisation du processeur.
Mais ce type de cache a aussi ses inconvénients: par exemple, l'impossibilité de mettre en cache des pages pour un utilisateur autorisé, ou pour un utilisateur dont le contenu de la page dépend des variables utilisateur actuelles.
Mise en cache de la base de données
La mise en cache de base de données est un processus inclus dans la conception d'applications informatiques qui génèrent des pages Web à la demande (dynamiquement) en accédant aux bases de données backend. Un cache de base de données améliore votre base de données principale en supprimant toute pression inutile sur celle-ci, généralement sous la forme de données lues fréquemment consultées. Le cache lui-même peut fonctionner dans un certain nombre de domaines, y compris votre base de données, votre application ou en tant que couche autonome.
Lorsque ces applications sont déployées sur des environnements à plusieurs niveaux qui impliquent des clients basés sur un navigateur, des serveurs d'applications Web et des bases de données principales, la mise en cache des bases de données de niveau intermédiaire est utilisée pour obtenir une évolutivité et des performances élevées.
Mise en cache d'objets
La mise en cache d'objets dans WordPress (cache d'objets) implique le stockage des requêtes de base de données. Il s'agit d'un mécanisme système intégré qui vous permet de sauvegarder des données (objets) de tout type et de les récupérer si nécessaire. Ce cache est utilisé pour stocker les résultats d'opérations complexes.
Lorsqu'il est activé sur votre site WordPress, il permet d'accélérer les temps d'exécution de PHP, de fournir du contenu aux visiteurs du site plus rapidement et de réduire la charge sur la base de données.
CDN (réseaux de diffusion de contenu)
Il s'agit d'une infrastructure réseau répartie géographiquement qui fournit une livraison rapide de contenu aux utilisateurs de services Web et de sites. Les serveurs inclus dans le CDN sont géographiquement situés de manière à minimiser le temps de réponse des utilisateurs du site / service.
Qu'est-ce qu'une API Transients dans WordPress?
L'API Transients est le moyen de stocker un bloc d'informations (une chaîne de code, du contenu HTML, des objets WP_Query, JSON) dans la base de données du site Web par opposition à la mise en cache du navigateur. L'API Transients est très similaire à l'API Options, mais la principale différence est que l'API Transients a un délai d'expiration ou, mieux, une durée de vie.
Les trois opérations principales pour les transitoires sont la définition de valeurs, l'obtention de valeurs et la suppression de valeurs :
1. Définissez un transitoire -
set_transient ($ clé, $ valeur, $ expire);
Pour définir un transitoire, vous pouvez utiliser la fonction set_transient () qui a trois composants:
- Clé - Nom unique court du transitoire. Doit contenir 172 caractères ou moins.
- Valeur - Tout type de variable PHP contenant les informations qui seront stockées dans la base de données.
- Délai d'expiration (durée de vie) - La durée pendant laquelle les informations seront stockées.
Par exemple, si nous voulons enregistrer notre requête de publication de listes pendant un jour:
set_transient ('unique_listing_posts_query_results_name',$ listing_posts_query_results, DAY_IN_SECONDS);
Comme vous pouvez le voir, nous avons utilisé l'une (DAY_IN_SECONDS) des nombreuses constantes de temps introduites dans WordPress 3.5 pour exprimer facilement le temps. Voici une liste complète des constantes de tous les temps:
MINUTE_IN_SECONDS = 60 (secondes) HOUR_IN_SECONDS = 60 * MINUTE_IN_SECONDS DAY_IN_SECONDS = 24 * HOUR_IN_SECONDS WEEK_IN_SECONDS = 7 * DAY_IN_SECONDS MONTH_IN_SECONDS = 30 * DAY_IN_SECONDS YEAR_IN_SECONDS = 365 * DAY_IN_SECONDS
2. Obtenez un transitoire -
get_transient ($ clé);
Pour obtenir un transitoire enregistré, nous pouvons utiliser
get_transient ($ nom_transient);
Dans notre cas, nous pourrions récupérer nos articles listant les résultats de la requête avec:
get_transient ( 'unique_listing_posts_query_results_name' );
Nous en verrons plus à ce sujet plus tard dans notre section d'exemples.
3. Supprimer un transitoire -
delete_transient ($ clé);
Comme nous l'avons expliqué dans les sous-sections précédentes, nous pouvons utiliser l'API Transients pour obtenir et stocker des réponses distantes ou locales (contenu ou requête de notre base de données) dans notre base de données.
Cependant, voici la question de savoir comment nous supprimons l'ancien contenu stocké (transitoire). Il existe deux façons d'effacer (supprimer) les transitoires:
Suppression automatique
Ce qui est cool avec les transitoires, c'est qu'ils expirent automatiquement si nous définissons le temps d'expiration (durée de vie) . Si vous essayez de récupérer un transitoire de votre base de données après son expiration, WordPress le supprimera automatiquement, évitant ainsi tout encombrement. Le transitoire sera recréé une fois que quelqu'un ouvrira le site Web. De cette façon, nous nous assurons que nous avons du contenu frais à partir de l'API distante ou locale.
Suppression manuelle
Parfois, nous devrons forcer le transitoire à mourir prématurément en le supprimant manuellement. Ceci est utile lorsqu'une activité donnée (ajouter un nouvel élément de menu, enregistrer ou mettre à jour un article, ajouter ou mettre à jour une catégorie, etc.) rendra les données mises en cache par nature obsolètes et nécessitant une mise à jour:
La fonction que nous devons utiliser est
delete_transient ($ nom_transient)
et dans notre cas, cela devrait être:
delete_transient ( 'unique_listing_posts_query_results_name' );
Remarque: Il est important de NE PAS utiliser de transitoires pour stocker des données précieuses qui ne peuvent pas être recréées!
Pourquoi devrions-nous utiliser des API transitoires?
Nous pouvons utiliser l'API Transients chaque fois que nous avons une valeur à forte intensité de calcul qui ne change pas très souvent et que vous souhaitez mettre en cache. Dans WordPress, il s'agit généralement de l'objet résultant d'une requête de base de données, mais cela peut vraiment être tout ce que vous stockez dans une variable, que ce soit une valeur scalaire, un tableau ou un objet.

Donc, dans l'ensemble, les transitoires sont excellents lorsque vous effectuez des requêtes complexes dans vos thèmes et plugins.
Avantages de la mise en cache des réponses distantes ou locales
Réponses API distantes
Les API distantes effectuent toujours plusieurs appels ou requêtes vers des serveurs distants et il y a une latence supplémentaire. Cela prend du temps et entraîne des retards. En outre, certaines API distantes peuvent avoir des limites de débit, ce qui signifie que vous pouvez atteindre la limite maximale de demandes dans une période donnée.
Et comme vous le savez déjà, nous pouvons profiter de l'API Transients pour mettre en cache la réponse (résultat) du serveur distant et la stocker dans notre base de données. Maintenant, nous pouvons utiliser le
get_transient ();
et affichez le résultat / contenu stocké (mis en cache) là où c'est nécessaire sans effectuer d'autres appels ou demandes à distance.
Tout cela va:
- Réduisez les appels et les demandes HTTPS à distance
- Réduisez l'utilisation du serveur CPU
- Améliorer le temps de chargement de la page du site Web
Réponses API locales
- essentiellement le HTML ou la requête résulte de la base de données. Vous pouvez utiliser l'API Transients non seulement pour la mise en cache des réponses distantes, mais également pour stocker le contenu HTML ou les résultats de requête dans la base de données locale. C'est très utile si vous souhaitez afficher une section HTML répétable sur votre site Web (widgets, curseurs, menus, etc.) ou simplement pour éviter que des requêtes de base de données complexes ou lentes ne soient déclenchées à chaque fois que quelqu'un visite votre site Web.
Où et quand utiliser les transitoires?
- Requêtes de base de données complexes et personnalisées
- Menus de navigation WordPress
- Widgets de la barre latérale qui affichent des informations telles que; des tweets, une liste de visiteurs récents du site ou une liste de messages d'une certaine catégorie
- Mise en cache des nuages de tags
- Mise en cache des requêtes HTTP externes
Utilisation et exemples
Après tant d'explications, il est temps de donner de vrais exemples.
Utilisation de base
function get_my_data () { $ data = get_transient ('mon_nom_transient'); if (false === $ data) {// La période transitoire a expiré / n'a pas été définie $ data = fetch_my_data (); // Extraire les données de la source d'origine set_transient ('mon_nom_transient', $ data, HOUR_IN_SECONDS); } retourner $ data; }
La fonction fetch_my_data () peut stocker un objet WP_Query, des données json, du contenu html , etc.
Exemple de base
Comme nous l'avons déjà expliqué, ce type de mise en cache est bon pour enregistrer le résultat de longues opérations, et l'exemple le plus simple est l'accès à des API externes, telles que Facebook.
Imaginez que nous ayons la fonction suivante, qui accède à l'API Facebook, demande un objet (plus précisément une page) your-website.url et renvoie le nombre de likes de la page:
function get_facebook_likes () { $ result = wp_remote_get ('https://graph.facebook.com/your-website.url'); $ result = json_decode (wp_remote_retrieve_body ($ result)); retourne $ result-> aime; } echo "Facebook aime:". get_facebook_likes ();
Le temps d'exécution de cette fonction dépend de nombreux facteurs, notamment l'emplacement de votre serveur par rapport aux serveurs Facebook, l'état et la vitesse du réseau, etc. En moyenne, une fonction peut prendre 1 à 3 secondes.
Cela signifie que lors de l'utilisation de cette fonction sur le site, le temps de chargement de chaque page augmentera de 1 à 3 secondes. De plus, si nous appelons cette fonction plus de 500 fois en 500 secondes, Facebook commencera à générer une erreur au lieu d'un résultat.
Pour accélérer cette fonctionnalité, nous pouvons utiliser l'API WordPress Transients et enregistrer le résultat pendant 1 heure:
function get_facebook_likes () { if (false === ($ likes = get_transient ('fb_likes'))) { $ result = wp_remote_get ('https://graph.facebook.com/your-website.url'); $ result = json_decode (wp_remote_retrieve_body ($ result)); $ likes = $ result-> likes; // Définit transitoire pendant une heure en secondes set_transient ('fb_likes', $ likes, 1 * HOUR_IN_SECONDS); } retourne $ likes; }
Ainsi, lorsque cette fonction est appelée pour la première fois, après avoir reçu une demande de Facebook, WordPress écrira le résultat dans la base de données et à l'avenir renverra ce résultat de la base de données pendant une heure sans faire de requêtes répétées au serveur Facebook. Et après une heure, la fonction se tournera à nouveau vers Facebook pour les données.
Avec cette approche, un seul appel à cette fonction par heure augmentera le temps de demande de 1 à 3 secondes, et les appels suivants seront émis instantanément.
Exemple plus complexe
Imaginez que nous ayons un site Web avec environ 100 catégories et environ 50000 articles, et dans la conception de l'article unique du site Web, nous avons un widget qui montre les N articles liés de la catégorie dans laquelle l'article actuel se trouve. Comme prévu, cette requête complexe prendra un certain temps pour extraire le résultat de la base de données et l'afficher sur le site Web.
Imaginez maintenant que vous avez 10 000 utilisateurs qui accèdent au site en même temps. Cela signifie que nous aurons plus de 10000 requêtes de base de données qui doivent faire la requête (il s'agit d'une requête complexe car elle rechercherait dans wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts tables , donc il y a plus de 10000 requêtes), pour obtenir le résultat pour les N articles de la catégorie associée et de les afficher sur le frontend. Cela, à son tour, surchargerait la base de données et retarderait le temps de chargement global du site Web et, dans certains cas, le planterait même en raison de la surcharge de la base de données.
Et voici la question de savoir comment optimiser et réduire le nombre de requêtes et de requêtes de base de données. Pourquoi avoir autant de requêtes à chaque fois que nous pouvons tirer parti de l'API Transients et simplement mettre en cache l'objet de requête ou mettre en cache toute la sortie HTML? De cette façon, nous réduirons et optimiserons le nombre de requêtes de base de données, ce qui entraînera de meilleures performances du site Web et une meilleure expérience utilisateur.
Dans notre cas, les requêtes rechercheront dans les tables wp_terms, wp_term_relationships, wp_term_taxonomy, wp_posts pour obtenir tous les résultats attendus.
Voici un exemple complet de la manière dont nous pouvons y parvenir:
function show_posts_from_category () { $ args = tableau ( 'cat' => 555, // ID de catégorie aléatoire 'posts_per_page' => 8, // Nombre aléatoire d'articles connexes à afficher 'No_found_rows' => vrai, ); $ hash = md5 ($ args ['cat']); // Hachage MD5 de l'ID de catégorie $ transient_key = 'catégorie-'. $ hash; // Clé transitoire if (false === ($ posts_from_category_html = get_transient ($ transient_key))): // Le transitoire a expiré / n'a pas été défini $ the_query = new WP_Query ($ args); // Récupère la requête ob_start (); // Activer la mise en mémoire tampon de sortie while ($ the_query-> have_posts ()): $ the_query-> the_post (); ?> <div class = "item"> <div class = "bigthumb"> <a href="<?php the_permalink();?> "rel =" bookmark "title =" <? php the_title ();?> "> <? php if (has_post_thumbnail ()) the_post_thumbnail ('big-thumb' ); ?> </a> </div> <h3> <a href="<?php the_permalink();?> "rel =" bookmark "title =" <? php the_title ();?> "> <? php the_title (); ?> </a> </h3> <? php the_excerpt (); ?> </div> <? php en attendant; $ post_from_category_html = ob_get_contents (); // Obtient le contenu du tampon de sortie sans l'effacer ob_end_clean (); // Désactive cette mise en mémoire tampon de sortie set_transient ($ transient_key, $ posts_from_category_html, $ transient_expire = 15 * MINUTE_IN_SECONDS); // Définition du transitoire avec un délai d'expiration de 15 minutes wp_reset_postdata (); fin si; return $ post_from_category_html; }
Dernières pensées
La mise en cache est un excellent moyen d'accélérer les choses, mais vous devez savoir exactement ce que vous mettez en cache, où vous pouvez le faire, quand et comment, sinon vous risquez de subir des conséquences inattendues.
Si vous ne savez pas si quelque chose fonctionne comme prévu, tournez-vous toujours vers le profilage - regardez chaque requête par rapport à la base de données, regardez tous les appels de fonction PHP, le timing et l'utilisation de la mémoire.
L'API Transients est un excellent moyen d'optimiser le temps de chargement de votre site Web WordPress et d'offrir une expérience utilisateur exceptionnelle. L'utilisation de transitoires dans vos plugins et thèmes est simple et n'ajoute que quelques lignes de code supplémentaires. Lorsqu'il est utilisé dans les bonnes situations - comme de longues requêtes de base de données ou des données traitées complexes - il peut économiser quelques secondes sur les temps de chargement de votre site.