Version 28 — Janvier 2019 — JLuc
En complément à Plugin ’macrosession’ : usage optimisé et extension des données de session.
Crédits et remerciements
- Ce plugin s’appuie sur l’expertise de Cédric, collectée et mise en forme dans l’article Du php dans le squelette à la place de #SESSION ou #CACHE 0.
- Le premier jet de code d’une macro a bénéficié de l’aide de marcimat.
- #SESSIONS
en critères de boucle
La boucle suivante ne peut PAS être déssessionnée en tant que boucle :
<BOUCLE_auteur(AUTEURS){id_article}{id_auteur=#SESSION{id_auteur}}>
<INCLURE{fond=encart_auteur}>
</BOUCLE_auteur>
Néanmoins, depuis macrosession .12., on peut dé-sessionner le squelette avec :
<BOUCLE_auteur(AUTEURS){id_article}>
#_SESSION_SI{id_auteur,==,#ID_AUTEUR}
<INCLURE{fond=encart_auteur}>
#_SESSION_FIN
</BOUCLE_auteur>
Le critère, au lieu de s’appliquer via SQL et d’être mis en cache, s’applique alors en PHP... . à tous les auteurs.
- Désessionner #URL_ACTION_AUTEUR
autrement que par une inclusion . Ça pourrait être simple de faire une macro , mais il faudra s’assurer qu’elle soit utilisable en argument d’un < code>#BOUTON_ACTION</code >. que ça marche avec # BOUTON_ACTION . Ou sinon peut être plutôt créer < code>#_BOUTON_ACTION_AUTEUR</code > #_ BOUTON_ACTION_AUTEUR qui rassemble les 2 ? Les < code>#URL_ACTION_AUTEUR</code > ne Mais les # URL_ACTION_AUTEUR sont pas souvent aussi utilisées dans d’autres contextes.
- Une extension de #SESSION qui sessionne « normalement » le cache mais permette d’accéder aux champs étendus gérés par #_SESSION. Il arrive que ça soit utile, quand on a besoin de manipuler une valeur comme un objet SPIP et non comme un code PHP.
- Calculer dès la compilation la fonction appelée pour un filtre, l’utiliser dans le code compilé, et du coup ne plus inclure inc/filtres dans mes_options.
- Interpréter dans le même bloc de code les 4 cas de calculs de l’argument id de #_AUTORISER_SI. Rassembler ’env’ et ’url’ au même endroit que #BALISE et #GETvariable
- Étendre la détection par le compilateur des erreurs et leur signalement :
<blockquote class="spip">SI SINON FIN
et signalement proprement par une erreur.[ ( |filtre) ]
.
</blockquote>- Mettre à disposition un mécanisme simple pour cacher et raffraîchir les valeurs de session étendue (cf les notes sur microcache plus bas)
- Syntaxe : dans SPIP, la syntaxe pour des éléments dynamiques (générant du PHP dans le cache) a souvent recours aux chevrons (<INCLURE> ou <BOUCLE_b()...>
). Il y a aussi des exceptions (#FORMULAIRES
). Il serait logique d’avoir une syntaxe avec des chevrons pour ces macros. On pourrait alors se passer du préfixe underscore.
Si l’accés ou le calcul des données étendues est coûteux, il faut le mettre en cache. C’est notamment le cas si l’accés se fait par une API sur un serveur externe.
recuperer_url_cache
Si les valeurs se font sur un serveur externe on peut simplement utiliser recuperer_url_cache
qui met en cache SPIP le fichier récupéré.
Dans mes essais, la durée de l’accés est alors divisé par 100 ou 200 : on passe de environ 200 ms à 1ou 2 ms.
Attention : les caches abandonnés ne sont jamais effacés et la réserve peut augmenter ! Il faut penser à faire le ménage, ou implémenter un cron de nettoyage périodique des caches périmés.
microcache
Le microcache (produit par le plugin éponyme) est un fichier cache totalement statique, de longue durée et dont le nom est facilement accessible. Du fait que le nom est accessible, on peut en effacer un sélectivement.
- Annonce sur seenthis
- Sources sur la zone
Le filtre |microcache
s’applique sur un id_auteur
, et reçoit le nom de fichier d’un squelette en argument. Le squelette caché par microcache reçoit l’id_auteur dans #ENV{id}
. On peut aussi appliquer |microcache
sur une chaine qui sert d’identifiant alphanumérique.
microcache stocke sous forme de fichiers et n’est donc souvent pas plus efficace que memoization.
Mais microcache a une interface pratique pour le stockage de data visiteur étendues ou squelettes de visu = un filtre portant sur un id_auteur, que n’a pas memoization en l’état.
Le code de microcache est simple et peut facilement être dupliqué et adapté pour d’autres formes de stockage que sur le disque. On pourrait donc faire un plugin dupliquant l’interface filtre de microcache et stockant avec memoization.
Une autre différence, c’est que microcache enregistre de manière plus « définitive » sur le disque dur, avec l’avantage que ça tient entre les redémarrages et l’inconvénients que ça se remplit sans jamais se vider si on ne fait rien.
Selon Fil, ce serait mieux de faire évoluer memoization
et d’abandonner microcache
. Et donc ajouter à memoization
une couche « filtre sur id_auteur ou identifiant string ».