SPIP-Contrib

SPIP-Contrib

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

289 Plugins, 197 contribs sur SPIP-Zone, 79 visiteurs en ce moment

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

Memoization, la librairie

9 avril 2018 – par Fil, JLuc

1 vote

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 ?
  • [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 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

  • Champs Extras 3

    16 janvier 2012 – 634 commentaires

    Ce plugin permet de créer et/ou de gérer des champs supplémentaires dans les objets éditoriaux de SPIP. Il permet donc de prendre en compte et d’afficher de nouveaux éléments dans n’importe quel objet éditorial de SPIP. Screencast Vous n’aimez pas (...)

  • Éditorial (HTML5UP)

    27 novembre 2017 – 61 commentaires

    Squelette SPIP pour intégrer le modèle Editorial de HTML5UP https://html5up.net/editorial Configuration La page de configuration permet quelques réglages. On y défini la couleur principale du site, des informations de contact et le contenu de la (...)

  • Timeline Me

    18 janvier – 10 commentaires

    TimelineMe - ​http://mickaelr.github.io/jquery-timelineMe/ - est un plugin jquery qui permet d’afficher des informations sur une ligne de temps. Le présent plugin pour SPIP l’utilise et propose un modèle pour afficher les articles d’une rubrique de (...)

  • GIS 4

    11 août 2012 – 1479 commentaires

    Présentation et nouveautés La version 4 de GIS abandonne la libraire Mapstraction au profit de Leaflet. Cette librairie permet de s’affranchir des librairies propriétaires tout en gardant les mêmes fonctionnalités, elle propose même de nouvelles (...)

  • Grappes 1.0

    23 novembre 2012 – 34 commentaires

    Présentation et nouveautés Cette version 1.0 du plugin Grappes est un portage pour SPIP 3.x. Le plugin permet de grouper des objets de SPIP dans des grappes. Les objets du core (articles, rubriques, auteurs, etc.) sont pris en charge, ainsi que (...)