Plugin mémoization

La mémoïzation est « une technique consistant à réduire le temps d’exécution d’une fonction en mémorisant ses résultats d’une fois sur l’autre » [1]. C’est aussi le nom d’un plugin SPIP qui a recours aux caches memcache(d), APC, eaccelerator ou redis, pour accélérer les accés aux caches SPIP. Il propose aussi une option de base, filecache, pour les hébergements sans cache mémoire.

La librairie utilisée pour ce plugin peut également être utilisée de manière autonome sur mesure dans le code d’un plugin, ou même par toute application indépendante de SPIP. Pour cela, voyez l’article « Memoization, la librairie ».

Mettre les caches en mémoire

Memoization est particulièrement utile lorsque votre hébergement propose un système de cache mémoire ’user’. À chacun des systèmes de cache mémoire les plus répandu correspond une option de memoization :
-  APC Cache ou APCu Cache
-  redis
-  memcache(d)

Lorsque votre site dispose de l’un de ces systèmes de caches, le paramétrage de memoization vous en propose le choix. Il suffit de choisir l’option, et votre SPIP bénéficie d’un cache mémoire au lieu d’un cache sous la forme de fichiers sur le disque. L’accès aux caches est donc grandement accéléré.

Lorsqu’activé sur un SPIP, le plugin memoization ne touche pas au fonctionnement habituel du cache de SPIP, sur la durée de mise en cache d’une page ou noisette. Cela ne fait que transférer le stockage du mécanisme de cache de SPIP dans la RAM. 

Il y a une autre différence par rapport au cache SPIP classique : avec memoization il n’y en a tout simplement pas de garbage collector car c’est chaque système de cache qui gère son propre nettoyage des données périmées. Cela permet d’éviter un bug récurrent sur les gros sites SPIP : l’« explosion » du cache.

APC ou APCu
-  Doc APC Cache (obsolète)
-  Doc APCu Cache
-  il n’y a aucun paramétrage supplémentaire à faire.
-  Lorsque vous activez l’option APC Cache ou APCu Cache, vous pouvez aussi bénéficier d’un navigateur-analyseur de cache en installant le plugin XRay en complément, ainsi que de fonctionnalités avancées de gestion du cache avec CacheLab.

redis
-  https://redis.io/clients
-  Pour ce système de cache, le paramétrage SPIP du plugin propose deux modes pour interroger la base : « Serveur » et « Socket Unix ». Ce choix dépends de la configuration du serveur redis choisi par l’admin sys.
-  Pour la sérialisation : privilégier SERIALIZER_IGBINARY, qui est plus performant

memcache(d)
-  memcached est une évolution plus récente de memcache.
-  Liens :

Autres options de cache

filecache

L’option filecache est la seule option qui ne range pas les caches en mémoire. On l’utilisera lorsque l’hébergement ne propose pas de cache en mémoire.

Avec filecache, memoization range les caches sous la forme de fichiers, comme le SPIP de base, mais distribue ces fichiers dans un plus grand nombre de dossiers que par défaut avec SPIP. Il n’y a pas de réglage limite pour le filecache ; par défaut, mémoization prévoit une distribution homogène des caches parmi 16^4 fichiers. La plupart du temps ce sera satisfaisant, mais en cas de collision, il est possible de modifier cette valeur et régler ainsi la taille maxi (il faudra faire quelques essais).

Note : l’option filecache est intégrée dans SPIP à partir de la version 3.1.

nocache

Avec nocache, SPIP ne gère plus de cache. C’est à utiliser temporairement seulement, le temps d’un débug par exemple.

Constante _MEMOIZATION_DELESTER_LOAD_SEUIL

Cette constante PHP règle le seuil de charge du serveur à partir de laquelle memoïzation va servir une version déjà en cache, même si elle est périmée. Ainsi, au delà de ce seuil, les calculs demandés sont moins fréquents.
-  La charge est connue par la fonction PHP sys_getloadavg
-  La valeur par défaut de cette constante est actuellement de 20.

Sur certains hébergements, la valeur renvoyée par sys_getloadavg n’est pas significative. On pourra dans ce cas annuler ce délestage en modifiant la valeur de la constante dans le fichier d’options du site. Par exemple :

define ('_MEMOIZATION_DELESTER_LOAD_SEUIL', 100000);

Notes sur la configuration

Réinitialisation : Si vous déplacez un site, avec copie intégrale de la base de données, et que le serveur d’accueil n’a pas les mêmes options disponibles (par exemple redis sur l’ancien, mais pas sur le nouveau), il faut vider la colonne valeur du champs memoization de la table spip_meta, puis activer le plugin memoization et le configurer.

XCache était jadis utilisable, mais n’est pas compatible PHP7 et a été retiré du plugin à partir de sa version 3.1.0.

Notes

[1d’après Wikipedia

Discussion

7 discussions

  • 1

    Si vous déplacez des sites, avec copie intégrale de la base de données, et que le serveur d’accueil n’a pas les options disponibles (par exemple j’avais redis sur l’ancien, mais pas sur le nouveau), il suffit de :

    Vider le colonne valeur du champs memoization de la table spip_meta

    Et ensuite, vous pourrez activer le plugin memoization et le configurer.

    • Merci. J’ai intégré cette précision en note à la fin de la doc.

    Répondre à ce message

  • 2

    Bonjour
    retour d’expérience

    PHP Version 7.4.27
    memcached v 3.1.5 et memcache v 4.0.5.2 sont activés

    memcached fonctionne mais en choisissant memcache

    Erreur d’exécution squelettes-xxx/sommaire.html | File […]/plugins/memoization/memoization_options.php Line 245 : Return value of cache_set() must be of the type bool, null returned

    merci pour ce plugin qui fonctionne super bien
    Natacha

    • En effet, PHP 7.4 est plus strict.
      En attendant un fix plus radical tu peux corriger chez toi :
      dans memoization_options, ajouter un ? avant tous les types de retour des fonctions des lignes 244 à 252 (et ailleurs si jamais). Donc par exemple pour l’erreur que tu signales ça devient

      function cache_set($key, $value, $ttl = null) : ?bool return memoization()->set($key, $value, $ttl) ;
      <∕code>

      C’est juste un pis aller en attendant mieux. Ça tourne bien sur certains PHP 7.4 me dit-on donc il ne doit pas y avoir beaucoup de problèmes... Sinon tu peux revenir à un pHP 7.3 (ça marche !) ou attendre une version qui globalement corrige.

      J’ai créé un ticket : https://git.spip.net/spip-contrib-extensions/memoization/issues/6

    • Nickel
      ça fonctionne
      bon ok j’avoue ne pas voir de différence de temps de chargement
      faudrait investiguer plus longuement pour mesurer la différence entre memcached et memcache

      merci en tout cas
      Natacha

    Répondre à ce message

  • 3

    Bonjour ;
    votre plugins fonctionne à présent.

    Mais est-ce normal ceci :

     Use of undefined constant _LOCK_MAX - assumed '_LOCK_MAX' (this will throw an Error in a future version of PHP) in /var/www/spip/plugins/auto/memoization/v2.1.9/memo/redis.inc on line 126

    et ceci :

    Warning: Redis::setTimeout() expects parameter 2 to be int, string given in /var/www/spip/plugins/auto/memoization/v2.1.9/memo/redis.inc on line 87

    Cela est apparue lors de la recherche d’un plugin dans l’interface Gestion des plugins -> recherche et ajout de plugins.
    Je rentre mon critère de recherche, et quand je clique sur « rechercher », j’ai ces erreurs (plusieurs fois), puis la recherche s’affiche en dessous de la liste des warnings.

    Encore un problème de mon côté ? Étrange car tout le reste du site semble fonctionner.

    Rémi.

    • C’est juste que ton hebergeur affiche les warnings, alors que la plupart du temps ils sont masqués. Cela étant, les warnings traduisent souvent une erreur de progr. Et en plus l’un d’entre eux sera bloquant dans le futur.

      Peux tu télecharger et installer manuellement une version que j’ai faite rapidement, et tester pour me dire les résultats ?

      https://git.spip.net/spip-contrib-extensions/memoization/archive/fix_warning_rsuinux.zip

      (j’ai pas d’install redis, donc j’ai pas pu tester, et vu que je suis fatigué... je préfère pas commiter directement).

    • Je viens d’installer :
      -  affichage sans être connecté : ok
      -  affichage après être connecté : ok
      -  interface de configuration/rédaction d’article : ok
      -  recherche d’un plugin (c’est ici ou j’ai eu les warnings) : ok !

      Plus aucune erreur !
      Bravo !
      J’espère que votre fatigue n’est pas dû au virus.
      Merci beaucoup et prenez soin de vous.
      Rémi.

    • Super, c’est publié !Ca sera disponible prochainement via SVP.

    Répondre à ce message

  • 3

    Bonsoir ;
    Comment détectez vous si le serveur Redis est présent (ou non), ainsi que sa méthode de connexion (socket ou tcp) ?
    Je vous explique rapidement :
    Je suis en auto hébergement, et donc j’ai accès à tout le serveur.
    Spip est installé depuis déjà plusieurs mois, et fonctionne. Je viens d’installer un serveur redis, configuré en socket, et il fonctionne parfaitement (test avec redis-cli).
    Mais memoization refuse de le découvrir !!! ça fait deux jours que je suis dessus.
    Si vous aviez une idée, merci de m’aider.
    Cordialement.
    Rémi.

    • Bonjour ;
      Merci pour cette réponse rapide.
      J’ai peur que ce soit malgré tout un problème de mon côté :
      php -m ne me renvois pas redis comme module chargé. Pas de module chargé, pas de réponse à la méthode : logique !

      Voila qui me désappointe fortement (et je n’aime pas être désappointé, selon la formule consacré)
      Je retourne donc à mes tablettes pour charger cette ?#« » !! de librairie .

      Merci de votre aide.
      Rémi.

    • Alors, résultat :
      Je mets ici pour information, même si cela ne concerne pas directement le plugin, la solution :
      Le problème venait ’simplement’ de l’installation de php7-redis sous Alpine Linux.
      Il faut (il m’a fallut) installer php7-pecl-redis ET php7-pecl-igbinary. Suite à ça, mettre les deux fichiers ini dans la configuration de php7.
      Seulement après, cela a fonctionné.
      Et oui, pour igbinary, c’est marqué « à privilégier » dans la doc. Mais sous alpine Linux, c’est compilé avec !!!

      Si cela aide quelqu’un, tant mieux. (peut être à intégrer dans la doc ?)
      Bonne soirée. Et encore merci pour la réactivité.

    Répondre à ce message

  • 1

    Un truc que je ne comprend pas : malgrès l’utilisation APCU j’ai quand même du cache « fichier » (mais bien plus petit que par le passé). Quid ?

    • Il y a plusieurs niveaux de cache. Les caches PHP (compilés dans le dossier skel) restent fichiers. Memoization ne traite que les caches HTML finaux.

    Répondre à ce message

  • 4

    Attention !
    Plantage du site laccreteil.fr lors de la mise à jour en v2.0.2, avec message impossible à vous copier ici car il n’est pas permis d’insérer des images ni d’utiliser les attributs html class ou style
    Bonne journée.
    Michel

    • Quel est le message d’erreur ?
      Vous pouvez le recopier en vous servant des touches de votre clavier.
      Ou si vous voulez absolument donner une image, indiquez un lien vers www.framapic.org

    • Ah il est indiqué sur spip-user :

      Fatal error: Uncaught Error: Call to a member function object() on null in /home/laccrete/www/plugins/auto/memoization/v2.0.2/memo/redis.inc:46 Stack trace: 
      #0 /home/laccrete/www/plugins/auto/memoization/v2.0.2/memoization_options.php(70): MCacheBackend_redis->get('b215325430f245d...') 
      #1 /home/laccrete/www/plugins/auto/memoization/v2.0.2/public/cacher.php(304): MCache->get('b215325430f245d...') #2 /home/laccrete/www/ecrire/public/assembler.php(46): public_cacher(Array, NULL, 'b215325430f245d...', Array, 0) 
      #3 /home/laccrete/www/ecrire/public.php(117): assembler('', NULL) 
      #4 /home/laccrete/www/spip.php(26): include('/home/laccrete/...') 
      #5 /home/laccrete/www/index.php(3): include('/home/laccrete/...') 
      #6 {main} thrown in /home/laccrete/www/plugins/auto/memoization/v2.0.2/memo/redis.inc on line 46
    • Voilà c’est corrigé dans la version 2.0.3

    • Merci !
      Attention, il faut attendre 2.0.3 car en auto, la version est encore 2.0.2 à cette heure !
      Bonne journée

    Répondre à ce message

  • 1

    Bonjour,
    Sur notre espace d’hébergement seuls autodetect/filecache ou nocache sont disponibles. Cela veut dire que l’hébergement ne propose pas de cache en mémoire et si je me fie à la doc, les performances sont un peu pénalisées.
    Que faut-il faire (modules à installer ? autre chose) pour rendre dsiponible memcache, APC et les autres ? Quelque chose à demander à l’hébergeur ?

    • Ce site est un site d’entraide autour de SPIP et cette doc porte sur le plugin memoization. L’installation des systèmes de caches mémoire cités ici n’entre pas dans ce cadre et pour ma part je suis incapable de vous répondre.
      Vous trouverez les indications utiles derrière les liens déjà fourni dans cette page. Ou sinon demandez à votre hébergeur ou à votre admin sys.

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom