SPIP-Contrib

SPIP-Contrib

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

290 Plugins, 198 contribs sur SPIP-Zone, 74 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

  • Mailsubscribers

    16 janvier 2013 – 407 commentaires

    Ce plugin permet de gérer les inscriptions (ou abonnements) à la diffusion de contenu par email. Mailsubscribers permet de gérer les inscriptions par Opt-in simple ou double et la désinscription par URL. Ce plugin gère également plusieurs listes de (...)

  • SPIP 3.2, Agenda et FullCalendar

    6 juin – commentaires

    Nous avions publié un article sur la manière d’utiliser FullCalendar avec SPIP 3.0 afin d’afficher des évènements sous forme d’Agenda. La version de FullCalendar a changé avec SPIP 3.2. Le présent article est donc un tutoriel adapté à SPIP 3.2. Pour (...)

  • Convertir un site SPIP 3 en utf-8 avec le plugin Grenier

    8 janvier 2014 – 22 commentaires

    SPIP 3 fonctionne nativement avec l’encodage universel unicode utf-8. Sur certains sites (par exemple sur une mise à jour), on peut avoir un site qui est resté en iso-latin ce qui n’est pas conseillé (source de bugs, d’incompatibilité, ...) . (...)

  • Nouvelle version - Modération de modifications

    29 janvier 2012 – 49 commentaires

    Suite à une migration depuis SPIP-Agora, j’ai développé ce plugin permettant de reprendre la fonctionnalité « Nouvelle version » inexistente sur SPIP2 ni sur SPIP3 Ce plugin permet d’étendre le work-flow de -rédaction-publication d’un article au cas d’un (...)

  • ScolaSPIP 4

    19 janvier 2016 – 358 commentaires

    ScolaSPIP est plugin-squelette responsive personnalisable pour sites Web d’établissements scolaires basé sur SPIPr Présentation de ScolaSPIP Ce plugin pour SPIP 3 est développé par la Dane de l’académie de Versailles pour les webmestres de cette (...)