{"componentChunkName":"component---src-templates-post-jsx","path":"/fr/cache-api","result":{"data":{"markdownRemark":{"html":"<p>Drupal 8 est arrivé avec plusieurs améliorations en performance, et qui dit performance dit cache.</p>\n<p>Dans cet article on va voir en détail les types de cache fournit par Drupal, et comment les utiliser dans nos modules personnalisés pour garantir une performance optimale aux utilisateurs.</p>\n<p>Avant de pencher dans les variétés du cache backend, je tiens à préciser que Drupal 8 fournit des modules installés par défaut :</p>\n<ul>\n<li><strong>Dynamic Page Cache</strong> et <strong>Internal Page Cache</strong>: ne nécessitent aucune configuration, il gére respectivement le cache pour les utilisateurs authentifiés et anonymes.</li>\n<li><strong>BigPipe</strong> : il s'agit d'une technique qui est connue dans le web introduite par Facebook, et qui permet de gagner en performance. L'idée du module est d'envoyer plusieurs morceaux d'une page les uns après les autres, afin de permettre au navigateur de charger les morceaux qui sont prêts pour l'affichage.\nCi-dessous une démonstration du fonctionnement de BigPipe</br></br>\n<img src=\"https://www.getopensocial.com/wp-content/uploads/2016/11/BigPipe-animation-02.gif\" alt=\"Alt Text\"></li>\n</ul>\n<p>L'API cache de Drupal utilise plusieurs bins qui sont liés à des tables de cache dans la base de donnée (commencent par le préfixe <code class=\"language-text\">cache_</code>), il faut alors commencer par demander un cache bin donné pour pouvoir interagir avec le cache API.</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\"><span class=\"token variable\">$render_cache</span> <span class=\"token operator\">=</span> \\<span class=\"token package\">Drupal</span><span class=\"token punctuation\">:</span><span class=\"token punctuation\">:</span><span class=\"token function\">cache</span><span class=\"token punctuation\">(</span><span class=\"token single-quoted-string string\">'render'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>La variable <code class=\"language-text\">$render_cache</code> dans le code snippet en-dessus présente un objet du cache bin render, néanmoins le cache dans cet exemple est appelé de manière statique, cependant si on travaille avec des classes qui est bien le cas dans les modules customs Drupal, il est recommandé d'utiliser l'injection des dépendances en injectant le service du cache (<code class=\"language-text\">cache.render</code> dans notre exemple).</p>\n<p>L'API cache (backend) est basée sur trois principes fondamentaux qu'il faut bien comprendre pour pouvoir les utiliser de manière efficace dans le développement des modules personnalisés : </p>\n<ul>\n<li>Les caches tags</li>\n<li>Les caches context</li>\n<li>Le cache par durée (max-age)</li>\n</ul>\n<h2>Caches tags</h2>\n<p>Le principe des caches tags est simple, ces derniers donnent la possibilité de tager des contenus, éléments du render avec des tags différents et précis, ces tags vont être invalidés par la suite après une action bien définie.\nExemple : Imaginant un simple contenu de type Article qui va être affiché dans sa propre page de détail, page de listing ou autres pages. Si on ne gère pas le cache dans le render array qui permet l'affichage des contenus, ces derniers vont être cachés dans le render array et on va finir par afficher du faux contenus aux utilisateurs.\nOn peut utiliser le tag <code class=\"language-text\">node_list</code> dans tous les render arrays qui affichent les contenus pour s'assurer qu'à chaque modification d'un contenu, tous les renders arrays tagés par le même tag (node_list) vont être invalidés afin de reconstruire le nouveau cache dans les render arrays et afficher le nouveau contenu. </p>\n<ul>\n<li>Par convention, les cache tags prennent le format <code class=\"language-text\">&lt;entity type ID&gt;:&lt;entity ID&gt;</code> ou <code class=\"language-text\">config:&lt;configuration name&gt;</code>, et si l'objet accepte qu'une seule instance on peut utiliser <code class=\"language-text\">objet</code> comme cache tag.</li>\n<li>Les caches tags sont tout simplement des chaines de caractères (ex: <code class=\"language-text\">node_list</code>, <code class=\"language-text\">config:system.performance</code>)</li>\n<li>On peut passer plusieurs cache tags dans un render array.</li>\n<li>L'ordre des caches tags dans un render array n'est pas pris en considération par Drupal. </li>\n</ul>\n<h3>( ! ) <strong>Remarque</strong></h3>\n<p>Il faut noter que les caches tags sur Drupal 8 ne supportent pas les tags des entités par bundle, ce problème sera résolu dans les prochaines versions de Drupal. En revanche, le module <strong><a href=\"https://www.drupal.org/project/handy_cache_tags\">Handy Cache Tags</a></strong> gère cette contrainte de manière efficace et qui permet d'utiliser des tags par bundle (ex: <code class=\"language-text\">handy_cache_tags:node:article</code>).</p>\n<hr/>\n<h2>Caches contexts</h2>\n<p>Comme son nom l'indique, un cache context se base sur les contextes définis par Drupal, en d'autres termes les caches contexts permettent de varier le cache dans un render array par chemin, utilisateur, langue, theme ou autres contextes.</p>\n<ul>\n<li>On peut ajouter plusieurs caches contexts dans un render array</li>\n<li>L'ordre des caches contexts dans un render array n'est pas pris en considération par Drupal.</li>\n<li>Par nature il y a une hiérarchie prédéfinie de contexts sur Drupal, par exemple lorsqu'on varie le cache par utilisateur, ça sert à rien de le varier par permission vu que l'utilisateur possède un groupe de permissions par défaut. </li>\n</ul>\n<h2>Caches Max Age</h2>\n<p>Le Cache Max-Age permet de cacher un render array sur une durée bien définie. Il prend le format d'un nombre positif en secondes (0, 60, 100).\nExemple d'utilisation du cache dans les render arrays :</p>\n<div class=\"gatsby-highlight\" data-language=\"php\"><pre class=\"language-php\"><code class=\"language-php\">\t<span class=\"token comment\">//Case of render array</span>\n    <span class=\"token variable\">$build</span><span class=\"token punctuation\">[</span><span class=\"token single-quoted-string string\">'#cache'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token single-quoted-string string\">'max-age'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\t\n\t<span class=\"token comment\">//Case of plugin bloc (OOP way)</span>\n\t<span class=\"token keyword\">public</span> <span class=\"token keyword\">function</span> <span class=\"token function\">getCacheMaxAge</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\t<span class=\"token punctuation\">{</span>\n\t\t<span class=\"token keyword\">return</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span>\n\t<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Comme on l'avait vu au début de cet article, Drupal dispose des modules Internal Dynamic Page Cache (gère le cache pour les utilisateurs authentifiés) et Internal Page Cache (gère le cache pour les utilisateurs anonymes), et bien ce dernier ne reconnait pas l'existence du cache max age, en d'autres termes si on rajoute un cache max-age dans un render array, ce dernier va être caché pour les utilisateurs anonymes à cause d'Internal Page Cache qui ne tient pas compte du max-age.\nIl est déconseillé d'utiliser le cache max-age dans vos développements personnalisés. D'ailleurs le cache max-age n'est pas utilisé dans le code source (Core) de Drupal.</p>","excerpt":"Drupal 8 est arrivé avec plusieurs améliorations en performance, et qui dit performance dit cache. Dans cet article on va voir en détail les types de cache…","frontmatter":{"date":"2020-01-20","metaDate":"2020-01-20","title":"Cache API","tags":["Cache","Performance","Module development","Drupal 8"],"path":"/cache-api","cover":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMEAgX/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQIE/9oADAMBAAIQAxAAAAHkUT61w4QI/8QAFxABAQEBAAAAAAAAAAAAAAAAABECAf/aAAgBAQABBQJitZvaqv/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABgQAAIDAAAAAAAAAAAAAAAAAAABIDEy/9oACAEBAAY/AizSh//EABoQAQACAwEAAAAAAAAAAAAAAAEAESFBUXH/2gAIAQEAAT8hK5AKqnsFXLvMsbg4pZ//2gAMAwEAAgADAAAAEMQ//8QAFhEBAQEAAAAAAAAAAAAAAAAAAQAR/9oACAEDAQE/EELL/8QAGBEAAgMAAAAAAAAAAAAAAAAAAAERIVH/2gAIAQIBAT8Qll6f/8QAGhABAAMBAQEAAAAAAAAAAAAAAQARITFxkf/aAAgBAQABPxBLpfGogq/QokeJLcTYKxQ+2/ZaFn//2Q==","aspectRatio":1.5025484199796126,"src":"/static/ef64ba6bb722b02d93e341af50253a73/7b269/speed.jpg","srcSet":"/static/ef64ba6bb722b02d93e341af50253a73/0b320/speed.jpg 480w,\n/static/ef64ba6bb722b02d93e341af50253a73/60b32/speed.jpg 960w,\n/static/ef64ba6bb722b02d93e341af50253a73/7b269/speed.jpg 1474w","srcWebp":"/static/ef64ba6bb722b02d93e341af50253a73/a4c59/speed.webp","srcSetWebp":"/static/ef64ba6bb722b02d93e341af50253a73/bc3bf/speed.webp 480w,\n/static/ef64ba6bb722b02d93e341af50253a73/39337/speed.webp 960w,\n/static/ef64ba6bb722b02d93e341af50253a73/a4c59/speed.webp 1474w","sizes":"(max-width: 1474px) 100vw, 1474px"},"resize":{"src":"/static/ef64ba6bb722b02d93e341af50253a73/c4f3a/speed.jpg"}}}}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"pathSlug":"/cache-api","locale":"fr","prev":{"fields":{"locale":"fr"},"frontmatter":{"path":"/event-api","title":"Event API","tags":["Event API","Hooks","Drupal 8","Module development"]}},"next":{"fields":{"locale":"fr"},"frontmatter":{"path":"/drupal-behaviors","title":"Drupal Behaviors","tags":["jQuery","JavaScript","Module development","Performance","Ajax"]}}}}}