Pour les administrateurs

En tant qu'administrateur, Joomla vous offre la possibilité de mettre en cache des parties de votre site. Vous pouvez choisir de mettre en cache des pages web entières ou seulement certaines parties de ces pages. Ce guide explique comment procéder.

Sur une page web d'un site Joomla, il y a 3 éléments qui peuvent être mis en cache :

  1. La page entière elle-même – le cache de page
  2. La sortie du composant Joomla pour cette page web – connue sous le nom de cache de vue
  3. La sortie des modules affichés sur cette page – connue sous le nom de cache de module

Vous disposez d'un certain nombre de paramètres de cache qui vous permettent de contrôler ce qui est mis en cache :

  1. Le plugin système « System – Page Cache »
  2. La Configuration Générale, onglet Système, Paramètres du cache. Ici, l'option Cache système peut être réglée sur
    • DÉSACTIVÉ – Mise en cache désactivée
    • ACTIVÉ – Mise en cache conservatrice
    • ACTIVÉ – Mise en cache progressive
  3. De nombreux modules disposent, dans leurs Paramètres, d'un onglet Avancé dans lequel la mise en cache peut être réglée sur Paramètres généraux ou Pas de mise en cache

Comme décrit ci-dessous, il existe également des règles de mise en cache qui sont implémentées dans le code de Joomla, et sur lesquelles vous n'avez aucun contrôle.

Vous pouvez vider le cache via le menu Administration → Système → Vider le cache. En général, vous pouvez considérer que Joomla dispose de 3 niveaux de cache, d'agressivité croissante

  1. Mise en cache conservatrice
  2. Mise en cache progressive
  3. Mise en cache de page

De plus, les développeurs Joomla peuvent utiliser des fonctionnalités de mise en cache pour stocker le résultat de requêtes à la base de données, par exemple pour augmenter la réactivité du site, mais cela sort du cadre des capacités d'un administrateur.

Mise en cache de page

Pour l'activer, allez dans Administration → Extensions → Plugins. Trouvez ensuite le plugin System – Page Cache, et activez-le. Cela signifie que les pages du site seront désormais mises en cache et qu'à chaque nouvelle demande, c'est la page mise en cache qui sera servie, plutôt qu'elle ne soit générée par Joomla à partir des informations de la base de données. La page mise en cache continuera d'être servie jusqu'à son expiration – telle que définie par le paramètre Durée du cache dans Administration → Configuration Générale → onglet Système → Paramètres du cache.

Si vous lisez cette page comme un tutoriel et souhaitez tester la mise en cache de page, il est préférable de régler les paramètres de cache de la Configuration Générale comme suit :

  • Gestionnaire de cache – Fichier
  • Chemin vers le dossier de cache – laisser vide
  • Durée du cache – 15 (la valeur par défaut de 15 minutes)
  • Mise en cache spécifique à la plateforme - Non
  • Cache système – DÉSACTIVÉ – Mise en cache désactivée

Pour vérifier que la mise en cache de page fonctionne, allez sur une page du site web qui affiche un article. Après avoir affiché cette page, vous devriez trouver dans le système de fichiers un répertoire cache/page contenant un fichier dont le nom ressemble à xxx-cache-page-yyy.php, où xxx et yyy sont de longues chaînes de hachage. Joomla doit stocker des pages de cache distinctes pour des URL distinctes, donc la seconde chaîne de chiffres hexadécimaux est un hachage de l'URL de la page web du site, afin de rendre le nom de fichier unique à cette page.

Utilisez ensuite les fonctionnalités de l'Administration pour modifier le texte de cet article, puis réaffichez la page web du site. Vous devriez trouver la version mise en cache, et non votre texte modifié.

Modifier un article (ou un autre élément Joomla) ne vide pas le cache de page pour la ou les pages web où cet article est affiché. Pour vider le cache de page, allez dans Administration → Système → Vider le cache. Cliquez sur la case à cocher à côté du Groupe de cache appelé « page », puis cliquez sur le bouton Supprimer. Lorsque vous réafficherez votre page web, elle devrait maintenant afficher votre texte modifié.

Si votre site dispose d'une fonctionnalité telle qu'un panier d'achat, l'application de la mise en cache de page causera des problèmes, car les pages doivent afficher ce que le client a déjà sélectionné, plutôt que d'afficher une page mise en cache commune à tous les visiteurs. Cependant, vous pouvez configurer le plugin Système - cache de page pour exclure de la mise en cache certains Liens de menu spécifiés ou certaines URL et plages d'URL (dans l'onglet Avancé), de sorte que seules les pages réellement statiques soient mises en cache.

Mise en cache conservatrice

Avec la Mise en cache conservatrice, vous pouvez mettre en cache la sortie de la vue des composants ainsi que la sortie de ceux des modules qui autorisent la mise en cache. Mais notez que cela ne fonctionnera que sur les pages qui ne sont pas mises en cache via le cache de page. Pour ces pages, la page web entière est mise en cache, et la Mise en cache conservatrice n'est même pas prise en considération.

Pour activer la Mise en cache conservatrice :

  1. Aller dans Administration → Système → Configuration Générale → onglet Système et, dans Paramètres du cache, régler le Cache système sur ON – Mise en cache conservatrice
  2. Aller dans Administration → Extensions → Modules et sélectionner les modules que vous souhaitez mettre en cache. Si ce module autorise la mise en cache, alors dans l'onglet Avancé vous devriez pouvoir régler la Mise en cache sur
  • Utiliser Global – ce module sera mis en cache (l'option Global ayant maintenant été réglée sur Mise en cache conservatrice)
  • Pas de mise en cache – ce module ne sera pas mis en cache.

(Notez que la Durée du cache dans la Configuration Générale est exprimée en minutes, mais que la Durée du cache dans les paramètres du module est exprimée en secondes.)

Pour vérifier que cela fonctionne, allez sur votre site, assurez-vous d'être déconnecté, et naviguez vers une page web qui affiche un article. Vérifiez votre système de fichiers et vous devriez trouver un dossier cache/com_content contenant un fichier de cache.

Vous trouverez également d'autres répertoires tels que cache/com_languages (l'affichage de la page impliquant le chargement de la langue courante, qui sera également mise en cache), ainsi que des répertoires liés au cache de module, par exemple cache/com_modules. Ceux-ci résultent de l'utilisation du cache que les développeurs ont codé au sein de l'application Joomla.

Si vous modifiez et enregistrez cet article puis actualisez la page du site, vous constaterez que le site affiche cette fois le texte mis à jour. Cela s'explique par le fait que, dès que la modification est enregistrée, Joomla vide le cache pour cet article.

Cependant, vous pouvez démontrer que le cache fonctionne en modifiant le fichier de cache dans le répertoire cache/com_content à l'aide d'un éditeur de texte basique. À l'aide de l'éditeur, modifiez une lettre dans le texte de l'article dans le fichier de cache et enregistrez le fichier. Ensuite, lorsque vous actualisez la page web, vous devriez voir le changement que vous avez apporté au fichier de cache.

Comment pouvez-vous sélectionner quelles vues de composants sont mises en cache, et dans quelles circonstances ? Hélas, vous ne pouvez pas le faire. Cela est déterminé par les développeurs du noyau de Joomla et codé dans le code PHP du composant. Les critères diffèrent pour chaque composant. Cependant, vous pouvez facilement découvrir quels critères sont utilisés car, pour chacun des composants du site, ils sont codés dans le fichier DisplayController.php du site. Par exemple, au moment de la rédaction de cette révision (Joomla version 5), pour le composant Contacts, on trouve dans components/com_contact/src/Controller/DisplayController.php

    public function display($cachable = false, $urlparams = [])
    {
        if ($this->app->getUserState('com_contact.contact.data') === null) {
            $cachable = true;
        }

Cela signifie que les vues associées aux contacts seront mises en cache, sauf s'il existe des données de session indexées par com_contact.contact.data – ce qui sera le cas si, dans la session utilisateur, l'utilisateur a affiché un formulaire de contact (par exemple sur une page pointée par un lien de menu de type Contacts → Contact unique).

Le fichier équivalent pour les articles components/com_content/src/Controller/DisplayController.php contient :

    public function display($cachable = false, $urlparams = false)
    {
        $cachable = true;

        /**
         * Set the default view name and format from the Request.
         * Note we are using a_id to avoid collisions with the router and the return page.
         * Frontend is a bit messier than the backend.
         */
        $id    = $this->input->getInt('a_id');
        $vName = $this->input->getCmd('view', 'categories');
        $this->input->set('view', $vName);

        $user = $this->app->getIdentity();

        if (
            $user->get('id')
            || ($this->input->getMethod() === 'POST'
            && (($vName === 'category' && $this->input->get('layout') !== 'blog') || $vName === 'archive'))
        ) {
            $cachable = false;
        }

L'expression $user->get('id') est vraie si l'utilisateur est connecté. Cela signifie que les articles ne sont jamais mis en cache pour les utilisateurs connectés. Les expressions suivantes concernent d'autres conditions dans lesquelles la mise en cache n'est pas effectuée, même si l'utilisateur n'est pas connecté.

Ainsi, vous pouvez découvrir les circonstances dans lesquelles la mise en cache est effectuée, mais il n'est pas conseillé de les modifier. Vous pouvez également démontrer que les modules sont mis en cache en utilisant le module Fil de navigation de Joomla, en vous assurant qu'il est affiché dans une position de module sur la page web, en définissant son paramètre de mise en cache et en modifiant manuellement le fichier mis en cache dans cache/mod_breadcrumbs.

Mise en cache progressive

Comme la mise en cache conservatrice, la mise en cache progressive met également en cache la sortie des vues de composants et des modules. La différence fonctionnelle entre les deux est qu'avec la mise en cache progressive, pour les utilisateurs déconnectés, tous les modules sont toujours mis en cache. Dans ce cas, définir le paramètre Pas de mise en cache pour un module n'a aucun effet. Si le paramètre de stockage du cache est défini sur Fichier, vous pouvez trouver le fichier de cache des modules (la sortie de tous les modules est stockée dans le même fichier) dans le répertoire cache/com_modules.

Pour activer la mise en cache progressive, allez dans Administration → Système → Configuration Générale → onglet Système et, dans Paramètres du cache, définissez Cache système sur ON – Mise en cache progressive.

En ce qui concerne les conditions de mise en cache des vues des composants principaux de Joomla, il n'y a aucune différence entre la mise en cache conservatrice et la mise en cache progressive. Contrairement à ce que vous pouvez lire sur certains sites web et dans des réponses à des questions sur Stack Overflow, il n'est pas vrai que la mise en cache conservatrice concerne le cas où l'utilisateur n'est pas connecté et la mise en cache progressive le cas où l'utilisateur est connecté.

Résumé

Un résumé des types de mise en cache figure ci-dessous.

Mise en cache de la page entière

  • Configuration : Plugin intégré (Administration → Extensions → Gestion des plugins → System - Page Cache)
  • Met en cache : chaque page entière de votre site
  • Basé sur : l'URL
  • Plus d'informations :
    • Mise en cache du navigateur optionnelle : met également en cache sur le navigateur/ordinateur de vos visiteurs
    • Ne met en cache les pages que pour les visiteurs invités (pas pour les visiteurs connectés). Soyez prudent en utilisant ce plugin si vous avez un site interactif où vous souhaitez servir du contenu basé sur les informations de session/cookie plutôt que sur la simple URL. Des fonctionnalités comme un panier d'achat ne fonctionneront pas.

Mise en cache de vue

  • Configuration : Configuration Générale -> Cache
  • Met en cache : chaque vue d'un composant
  • Basé sur : l'URL, la vue, les paramètres, ...
  • Plus d'infos : Les développeurs de composants doivent inclure cela dans leur code pour que cela fonctionne. La plupart du temps, ce n'est pas fait. Le composant de contenu principal de Joomla utilise cela, mais uniquement pour les visiteurs invités de votre site, bien que cela ne soit pas obligatoire pour chaque composant.

Mise en cache de module

  • Configuration : Configuration Générale -> Cache
  • Cache : chaque module (personnalisé individuellement via les Paramètres Avancés de chaque module)
  • Basé sur : l'id du module, les niveaux de visualisation de l'utilisateur et le paramètre Itemid dans la requête HTTP
  • Plus d'infos : Vous devez le désactiver sur certains modules pour éviter des problèmes

Plus sur la mise en cache

Si vous souhaitez découvrir d'autres systèmes de cache et possibilités, vous pourriez vouloir consulter les extensions tierces liées à la mise en cache.

Moteurs ou stockages de cache

  • Configuration : Configuration Générale -> Cache

Ici, vous pouvez choisir quel système vous voulez que votre site utilise pour toute la mise en cache. Certains paramètres sont : APC, Eaccelorator, File, Memcache, Redis, XCache.

APC, par exemple, met également en cache votre opcode PHP.

Pour les développeurs

Cette section doit être révisée pour Joomla! 4/5.

La classe JCache permet de nombreux types et niveaux de mise en cache différents. Les sous-classes suivantes sont créées spécifiquement, mais vous pouvez ajouter les vôtres, ou utiliser la classe principale de nombreuses façons différentes.

N'oubliez pas que le premier niveau de cache rencontré remplacera toute mise en cache plus profonde. Je suppose qu'un trop grand nombre de niveaux est également contre-productif (à vérifier cependant).

  • JCacheView met en cache et renvoie la sortie d'une vue donnée (en MVC). Un identifiant de cache est automatiquement généré à partir de l'URI, de la vue spécifique et de sa méthode spécifique, ou vous pouvez en fournir un vous-même.

Cela peut être fait automatiquement via la fonction display du contrôleur de base. Par exemple dans le contrôleur de votre composant :

class DeliciousController extends JController {
    function display() {
        parent::display(true); //true asks for caching.
    }
}

Il existe également quelques urlparams à prendre en compte. Consultez ce Joomla StackExchange

Soyez également conscient que toute mise à jour (comme les clics ou les compteurs de visites) ne sera PAS mise à jour (sauf si vous ajoutez cela en dehors de cette méthode et donc de toute partie MVC plus profonde.)

  • JCachePage met en cache et renvoie le corps de la page.
  • JCacheCallback met en cache et renvoie la sortie et les résultats de fonctions ou de méthodes.

Si vous souhaitez mettre en cache des requêtes, c'est une bonne classe pour cela, comme illustré ici : Using caching to speed up your code

  • JCacheOutput met en cache et renvoie la sortie.

Ceci est plutôt destiné à mettre en cache une partie spécifique de code PHP. Cela agit comme un tampon de sortie, mais mis en cache.