SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano | Nederlands

290 Plugins, 198 contribs sur SPIP-Zone, 99 visiteurs en ce moment

Accueil > Optimisation et performances > Memoization > Memoization, la librairie

Memoization, la librairie

9 avril 2018 – par Fil, JLuc

2 votes

Mémoïzation est un terme d’informatique, dont Wikipédia donne la définition suivante : « 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 ». C’est aussi le nom d’une nouvelle librairie de fonctions pour PHP, qui fait suite à mes expérimentations sur XCache.
À l’heure actuelle le plugin Memoization pour SPIP fonctionne avec memcache, APC, xcache, eaccelerator et redis, ainsi que sur l’option de base, filecache.

Cette librairie est développée sous forme d’un plugin pour SPIP, mais est codée de manière autonome, ce qui permet de l’utiliser indépendamment de SPIP. C’est cet aspect qui est détaillé dans cet article. Pour la doc du plugin, voyez l’article « Plugin mémoization ».

Sa double licence — LGPL ou MIT, selon votre choix — permet de l’intégrer librement dans n’importe quel projet PHP.

Le fichier memoization_options.php définit les fonctions suivantes :

  1. mixed cache_me()
  2. mixed cache_get(string key)
  3. bool  cache_set(string key, mixed value [, int ttl])
  4. bool  cache_isset(string key)
  5. bool  cache_unset(string key)
  6. int   cache_inc(string key [, int value [, int ttl] ])
  7. int   cache_dec(string key [, int value [, int ttl] ])
  8. bool  cache_lock(string key)
  9. bool  cache_unlock(string key)
  10. mixed cache_edito_get($key)
  11. mixed cache_edito_set($key, $value)

Télécharger

Ces fonctions sont assurées par le module xcache s’il est disponible, et dans le cas contraire par eaccelerator, APC, etc., voire même — au pire — par des méthodes utilisant le système de fichiers.

Ces fonctions sont très proches de ce que permet XCache.
Comparé à XCache :
— on n’a pas conservé la fonction cache_unset_by_prefix, très difficile à émuler sur les autres librairies ;
— on a en revanche ajouté les fonctions cache_lock() et cache_unlock().

Les fonctions cache_edito_get et cache_edito_set complètent ce jeu de fonction : lorsqu’une valeur a été mise en cache par cache_edito_set , on ne la récupère avec cache_edito_get que si le cache SPIP n’a pas été invalidé depuis, par une modification du contenu éditorial.

Interface de programmation (API)

mixed cache_me() est la fonction de mémoïzation proprement dite, telle que je l’ai décrite, sous le nom W(), dans un autre article (« Utiliser xcache pour accélérer n’importe quel script PHP »).

Pour « mémoïzer » une fonction définie comme :

  1. function A($param) {
  2.         calculs ...
  3.         return $resultat;
  4. }

Télécharger

il suffit de lui ajouter une ligne :

  1. function A($param) {
  2.         if (!is_null($W = cache_me())) return $W;
  3.         calculs ...
  4.         return $resultat;
  5. }

Télécharger

Les résultats sont alors mémoïzés et restitués, lors de l’exécution de la même fonction par la suite (et avec les mêmes arguments), sans devoir refaire les calculs ; cela fonctionne bien sûr au sein d’un même hit, mais aussi entre des hits successifs consécutifs. (Pour les cas où il est judicieux d’employer cette technique, se reporter à l’article initial.)

Exemple

À titre d’exemple voici comment je faisais, auparavant, pour mémoïzer le chargement d’une URL distante :

  1. function recuperer_page_cache($url, $delai=3600) {
  2.    $cache = _DIR_CACHE.'url_'.md5($url);
  3.    if (($GLOBALS['var_mode']
  4.    OR !file_exists($cache)
  5.    OR filemtime($cache)<time()-$delai
  6.    )
  7.    AND $contenu = recuperer_page($url))
  8.        ecrire_fichier($cache, $contenu);
  9.    lire_fichier($cache, $contenu);
  10.    return $contenu;
  11. }

Télécharger

désormais, je fais :

  1. function recuperer_page_cache($url, $delai=3600) {
  2.    if (!is_null($W = cache_me(null, $delai)))
  3.        return $W;
  4.    return recuperer_page($url))
  5. }

Télécharger

Non seulement c’est plus propre, mais le code tire automatiquement avantage d’un cache en RAM si celui-ci est dispo.

Les autres fonctions de l’API sont plus traditionnelles :

mixed cache_get(string key) récupère la valeur stockée sous la clé $key, ou null si l’info n’est pas disponible ou a expiré.

bool cache_set(string key, mixed value [, int ttl]) stocke une valeur sous la clé $key, avec une durée d’expiration de ttl secondes (par défaut, pas d’expiration).
Renvoie true en cas de succès, false en cas d’échec.

bool cache_isset(string key) renvoie true si la clé a une valeur disponible et non expirée, false dans le cas contraire.

bool cache_unset(string key) efface l’éventuelle valeur de la clé key.

int cache_inc(string key [, int value [, int ttl] ]) ajoute value (par défaut, value=1) à la valeur numérique entière de la clé key, règle, le cas échéant, le ttl, et renvoie le résultat.

int cache_dec(string key [, int value [, int ttl] ]) retire value (par défaut, value=1) à la valeur numérique entière de la clé key, règle, le cas échéant, le ttl, et renvoie le résultat.

cache_lock(string key) verrouille la clé key, et assure l’unicité de notre accès à cette clé jusqu’à ce qu’on libère le lock, ou que le processus se termine.

cache_unlock(string key) déverrouille la clé key.

Dernière modification de cette page le 9 avril 2018

Retour en haut de la page

Répondre à cet article

Qui êtes-vous ?

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 Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • Jeux pour SPIP 3

    27 juillet 2012 – 53 commentaires

    Un portage pour SPIP 3 du plugin Jeux a été fait. Explications et nouveautés. Cet article concerne une mise à jour du plugin Jeux dont la description complète est disponible ici : Des jeux dans vos articles !. Le code du plugin Jeux est un code (...)

  • Plugin Vidéo(s)

    23 novembre 2010 – 704 commentaires

    Interface de gestion et modèle d’insertion des vidéos : Dailymotion Vimeo Youtube Modèle de la balise HTML5 video avec alternative flash html5media : Lecture HTML5/Flash pour tout navigateur des fichiers MP4/H264/Ogg/WebM/Mkv Support mobile, iPad, (...)

  • Vidéo Accessible

    6 avril 2011 – 168 commentaires

    Un plugin pour faciliter la diffusion de vidéos accessibles. Accessibilité des vidéos Accessibilité de la vidéo Afin d’être pleinement accessible, une vidéo (composée d’images et de sons) doit répondre à plusieurs critères. Le critère de base est (...)

  • Groupes de mots clés arborescents

    26 juillet 2012 – 37 commentaires

    Ce plugin permet de gérer une arborescence de groupes de mots clés. Les sous groupes de mots héritent des propriétés du groupe racine (sur quoi peut on le lier ? peut il y avoir un ou plusieurs mots). Les formulaires de liens qui permettent de lier (...)

  • Mailshot

    16 janvier 2013 – 336 commentaires

    Ce plugin prend en charge l’envoi en nombre d’info-lettres par email. Mailshot permet l’envoi en nombre d’emails au moyen d’un SMTP (ou d’un service externe) dédié à cet effet. Il permet de limiter la cadence d’envoi. Enfin, ce plugin implémente la (...)