Browse Source

Version 1.3.0 compatible avec memoization 3

master v1.3.0
JLuc 1 year ago
parent
commit
e358d81d8f
  1. 26
      inc/cachelab.php
  2. 51
      inc/cachelab_invalideur.php
  3. 12
      paquet.xml
  4. 31
      public/cachelab_balises.php

26
inc/cachelab.php

@ -9,15 +9,15 @@ include_spip('inc/cachelab_utils');
* Applique une action sur un cache donné et renvoie éventuellement une donnée
* Nécessite Mémoization (toutes méthodes OK).
*
* @param string $action : del, pass, list, clean, list_html, get, get_html ou user defined
* @param string $cle : clé du cache ciblé
* @param null|array $data : valeur du cache pour cette clé (pas forcément fourni)
* @param $options
* @param $return : résultat éventuellement fourni, pour les actions list et get
* @return bool : indique si l'action a pu être appliquée ou non
* @param string $action del, pass, list, clean, list_html, get, get_html ou user defined
* @param string $cle clé du cache ciblé
* @param null|array $data valeur du cache pour cette clé (pas forcément fourni)
* @param $options pour les fonctions cachelab_cibler_{action}
* @param &$return résultat éventuellement fourni, pour les actions list et get
* @return bool indique si l'action a pu être appliquée ou non
*/
function cachelab_appliquer(string $action, string $cle, $data = null, $options = '', &$return = null) {
global $Memoization;
function cachelab_appliquer(string $action, string $cle, $data = null, $options = '', &$return = null) : bool {
$Memoization = memoization();
if (!isset($Memoization) or !$Memoization) {
spip_log("cachelab_appliquer ($action, $cle...) : Memoization n'est pas activé", 'ERREUR_cachelab');
return false;
@ -38,7 +38,7 @@ static $len_prefix;
}
break;
// gérés par cachelab_cibler
// entièrement gérés par cachelab_cibler
case 'pass': // passe
case 'list': // renvoie les clés
case 'clean': // nettoie
@ -77,7 +77,7 @@ static $len_prefix;
if (function_exists($f)) {
return $f($action, $cle, $data, $options, $return);
} else {
spip_log("L'action $action n'est pas définie pour cachelab_applique", 'ERREUR_cachelab');
spip_log("L'action '$action' n'est pas définie pour cachelab_applique", 'ERREUR_cachelab');
return false;
}
}
@ -154,7 +154,7 @@ function cachelab_prepare_conditions(array $conditions) {
*
*/
function cachelab_cibler(string $action, array $conditions = array(), array $options = array()) {
global $Memoization;
$Memoization = memoization();
if (!isset($Memoization) or !$Memoization or !in_array($Memoization->methode(), array('apc', 'apcu'))) {
spip_log("cachelab_cibler($action...) : Mémoization n'est pas activé avec APC ou APCu", 'ERREUR_cachelab');
die("cachelab_cibler($action...) : le plugin Mémoization doit être activé avec APC ou APCu");
@ -162,8 +162,7 @@ global $Memoization;
$return = $session = $chemin = $chemins = $cle_objet = $id_objet = $plusfunc = null;
// Prise en compte des OU (alternatives de conditions)
// Attention la réentrance n'est pas prévue historiquement alors surprises en perspectives
// Prise en compte des 'OU' ('OR', alternatives de conditions)
$l_conditions = (isset($conditions['ou']) ? $conditions['ou'] : '') or (isset($conditions['or']) ? $conditions['or'] : '');
if (!$l_conditions) {
$l_conditions = array($conditions);
@ -336,7 +335,6 @@ global $Memoization;
// pour les filtres suivants on a besoin du contenu du cache
if ($cle_objet or $plusfunc) {
global $Memoization;
$mdata = $Memoization->get (substr ($cle, $len_prefix));
if (!$mdata or !is_array ($mdata)) {
spip_log ("clé=$cle : mdata est vide ou n'est pas un tableau : " . print_r ($mdata, 1), 'ERREUR_cachelab');

51
inc/cachelab_invalideur.php

@ -89,29 +89,33 @@ function suivre_invalideur($cond, $modif = true) {
}
}
//
// Surcharge de maj_invalideurs
// le core indique : "Calcul des pages : noter dans la base les liens d'invalidation"
//
// Appelé à la fin de creer_cache
// $page est le tableau décrivant le cache qui vient d'être calculé
// avec les clés suivantes pour ses métadonnées :
// squelette,source,process_ins,invalideurs,entetes,duree,texte,notes,contexte,lastmodified,sig
// http://code.spip.net/@maj_invalideurs
//
// S'il y a une entete X-Spip-Methode-Duree-Cache on récupère la méthode
// et on appelle la fonction cachelab_calcule_duree_cache_lamethode
// avec en argument la valeur de l'argument dans l'envt ou de date_creation par défaut
// On corrige alors la durée du cache avec la valeur retournée.
//
// S'il y a une entete X-Spip-Filtre-Cache on récupère le filtre
// et on l'appelle avec le cache entier en argument
// Le filtre peut modifier n'importe quelle partie du cache, métadonnée ou résultat de compilation.
//
// define ('LOG_INVALIDATION_CORE', true);
/**
* @param $fichier
* @param $page
*
* Surcharge de maj_invalideurs
* le core indique : "Calcul des pages : noter dans la base les liens d'invalidation"
*
* Appelé à la fin de creer_cache
* $page est le tableau décrivant le cache qui vient d'être calculé
* avec les clés suivantes pour ses métadonnées :
* squelette,source,process_ins,invalideurs,entetes,duree,texte,notes,contexte,lastmodified,sig
* http://code.spip.net/@maj_invalideurs
*
* S'il y a une entete X-Spip-Methode-Duree-Cache on récupère la méthode
* et on appelle la fonction cachelab_calcule_duree_cache_{lamethode}
* avec en argument la valeur de l'argument dans l'envt ou de date_creation par défaut
* On corrige alors la durée du cache avec la valeur retournée.
*
* S'il y a une entete X-Spip-Filtre-Cache on récupère le filtre
* et on l'appelle avec le cache entier en argument
* Le filtre peut modifier n'importe quelle partie du cache, métadonnée ou résultat de compilation.
*
* @see creer_cache()
*/
function maj_invalideurs($fichier, &$page) {
global $Memoization;
$Memoization = memoization();
// Rq : ici, le texte du cache est non zipé (cf function creer_cache dans memoization),
// tandis que la version en cache peut être zipée (avec index 'gz').
if (LOG_INVALIDATION_CORE) {
@ -167,6 +171,7 @@ static $var_cache;
}
} else {
spip_log("#CACHE duree cache : la fonction '$f' n'existe pas (arg='$arg')\n".print_r($page, 1), 'ERREUR_cachelab');
return;
}
}
@ -177,14 +182,14 @@ static $var_cache;
}
if ($var_cache) {
echo "<div class='cachelab_blocs' $hint_squel><h6>Contexte duree-cache : $duree</h6><small>$infos</small></div>";
echo "<div class='cachelab_blocs' $hint_squel><h6>Contexte duree-cache : ".($duree ?? 'Erreur : durée non definie (fonction '.($f ?? 'indéfinie'))."</h6><small>$infos</small></div>";
}
$page['entetes']['X-Spip-Cache']
= $page['entetes']['X-Spip-Contexte-Duree-Cache']
= $page['duree']
= $duree
= intval($page['contexte']['duree-cache']);
= intval($page['contexte']['duree-cache']);
// (idem : creer_cache appelle maj_invalideurs *aprés* d'avoir écrit le cache)
//

12
paquet.xml

@ -1,17 +1,19 @@
<paquet
prefix="cachelab"
categorie="performance"
version="1.2.2"
etat="stable"
compatibilite="[3.0.0;4.0.*]"
version="1.3.0"
etat="test"
compatibilite="[4.0.0;4.0.*]"
logo="prive/themes/spip/images/cachelab-32.png"
documentation="https://contrib.spip.net/5033"
>
<nom>CacheLab</nom>
<!-- Invalidation ciblée et autres actions sur les caches APC filtrés des squelettes SPIP -->
<!-- Invalidation ciblée et autres actions sur les caches APCu filtrés des squelettes SPIP -->
<auteur lien="https://contrib.spip.net/JLuc">JLuc</auteur>
<credit lien="https://thenounproject.com/term/lab/1796357/">Icone de Nawicon Studio, Licence Creative Commons</credit>
<necessite nom="memoization" compatibilite="[3.0.1;]" />
<!-- Utilise Xray optionnellement mais on ne peut pas l'indiquer car utilisation réciproque -->
<pipeline nom="insert_head_css" inclure="cachelab_pipelines.php" />
</paquet>

31
public/cachelab_balises.php

@ -245,25 +245,27 @@ function cachelab_filtre_log($cache, $arg) {
* @param $totarg
* @return null
*
* Assertions sur le fait que le cache est sessionné ou non
* et que l'internaute est identifié ou non
*
* usages :
* 'assert' est utile pour vérifier que le sessionnement se passe bien comme prévu, et durablement,
* et pour optimiser le découpage des noisettes et l'emploi de macrosession
* On indique l'état théorique du sessionnement.
* Les valeurs possibles sont : oui, oui_login, oui_anonyme, non, anonyme
* Dans le cas où un assert n'est pas vérifié, un log est créé dans le fichier cachelab_assertsession
* 4 actions possibles : 'assert', 'log', 'insert', 'echo'
*
* 'assert' permet de vérifier que le sessionnement se passe bien comme prévu, et durablement,
* et facilite aussi l'optimisation du découpage des noisettes et l'emploi de macrosession
* On précise l'état attendu du sessionnement ou non et le fait que l'internaute est identifié ou non
* Les valeurs possibles sont : oui, oui_login, oui_anonyme, non, anonyme
* Dans le cas où un assert n'est pas vérifié, un log est créé dans le fichier cachelab_assertsession
* Exemples :
* #CACHE{3600, session assert non} s'assure que les emplois sont non-sessionnés
* #CACHE{session assert oui} s'assure que tous les emplois sont sessionnés
* #CACHE{session assert oui_login} s'assure que tous les emplois sont sessionnés avec un internaute identifié
* #CACHE{session assert oui_anonyme} s'assure que tous les emplois sont sessionnés avec un internaute identifié (inutile ?)
* #CACHE{session assert anonyme} s'assure que tous les emplois sans internaute identifié
* #CACHE{session assert anonyme} s'assure que tous les emplois sont sans internaute identifié
*
* #CACHE{session log} loge l'état du sessionnement dans un cache dédié à ce squelette
* #CACHE{session insert} insère à la fin du cache l'affichage de l'état du sessionnement
* #CACHE{session echo} affiche l'état du sessionnement comme var_cache mais pour ce cache seulement et seulement pour les caches dynamiques
* 'log' : loge l'état du sessionnement dans un cache dédié à ce squelette
* #CACHE{session log}
* 'insert' : insère à la fin du cache l'affichage de l'état du sessionnement
* #CACHE{session insert}
* 'echo' : affiche l'état du sessionnement
* comme la variable d'url 'var_cache' mais pour ce cache seulement et seulement pour les caches dynamiques
* #CACHE{session echo}
*
*/
function cachelab_filtre_session(&$cache, $totarg) {
@ -312,8 +314,7 @@ function cachelab_filtre_session(&$cache, $totarg) {
break;
case 'insert':
global $Memoization;
if (!isset($Memoization)) {
if (!memoization()) {
spip_log("Erreur dans $source : #CACHE{session insert} nécessite que le plugin Memoization soit activé", 'ERREUR_cachelab');
echo "<div class='cachelab_blocs'><h6>Erreur dans $source : #CACHE{session insert} nécessite que le plugin Memoization soit activé</h6></div>";
break;

Loading…
Cancel
Save