Changeset 112506 in spip-zone


Ignore:
Timestamp:
Nov 22, 2018, 12:22:29 PM (3 weeks ago)
Author:
jluc@…
Message:

nouveau filtre de cache : assertsession pour mise au point avec macrosession + debug + plus grande souplesse dans les arguments de #CACHE

Location:
_plugins_/cachelab/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/cachelab/trunk/inc/cachelab_invalideur.php

    r112499 r112506  
    8888}
    8989
     90//
     91// Surcharge de maj_invalideurs
    9092// le core indique : "Calcul des pages : noter dans la base les liens d'invalidation"
    9193//
     
    9698// http://code.spip.net/@maj_invalideurs
    9799//
    98 // S'il y a une entete X-Spip-Methode-Duree-Cache, on récupère la méthode
    99 // et on appelle la fonction cachelab_calcule_duree_cache_lamethode avec le paramètre $page
    100 // On corrige alors la durée du cache avec la valeur retournée
     100// S'il y a une entete X-Spip-Methode-Duree-Cache on récupère la méthode
     101// et on appelle la fonction cachelab_calcule_duree_cache_lamethode
     102// avec en argument la valeur de l'argument dans l'envt ou de date_creation par défaut
     103// On corrige alors la durée du cache avec la valeur retournée.
    101104//
     105// S'il y a une entete X-Spip-Filtre-Cache on récupère le filtre
     106// et on l'appelle avec le cache entier en argument
     107// Le filtre peut modifier n'importe quelle partie du cache, métadonnée ou résultat de compilation.
     108//
     109
     110define ('LOG_INVALIDATION_CORE', true);
    102111function maj_invalideurs($fichier, &$page) {
    103112global $Memoization;
     
    107116                // Abondamment appelé. À part pour pas noyer les autres
    108117                spip_log ("maj_invalideurs($fichier, &page)", "invalideur_core_maj_invalideurs");
     118                spip_log ("maj_invalideurs($fichier, &page)\n".print_r($page,1), "invalideur_core_maj_invalideurs_details");
    109119        }
    110120
  • _plugins_/cachelab/trunk/paquet.xml

    r112499 r112506  
    22        prefix="cachelab"
    33        categorie="outil"
    4         version="0.5.0"
     4        version="0.5.1"
    55        etat="dev"
    66        compatibilite="[3.0.0;3.2.*]"
  • _plugins_/cachelab/trunk/public/cachelab_balises.php

    r112499 r112506  
    4343
    4444                $t = trim($p->param[0][1][0]->texte);
    45                 if (_request('debug')) echo "t=$t<br>";
    4645                if (preg_match(',^[0-9],', $t)) {
     46                        ++$i;
    4747                        $duree = valeur_numerique($pd = $p->param[0][1][0]->texte);
    4848
     
    6161                                        . "'.'>'";
    6262                        }
    63                         ++$i;
    64                 }
    65                 elseif (_request('debug'))
    66                         echo "t=$t<br>";
     63                }
    6764
    6865                // recuperer les parametres suivants
     66                // C'est analyse_resultat_skel qui transforme les headers du code en tableau $headers
     67                // S'il y a plusieurs fois la mm entete, seule la dernière valeur est retenue
     68                //
    6969                while (isset($p->param[0][++$i])) {
    7070                        $pa = ($p->param[0][$i][0]->texte);
     
    7373                                and $duree > 0
    7474                        ) {
    75                                 $code .= ".'<'.'" . '?php header("Cache-Control: max-age='
     75                                $code = ".'<'.'" . '?php header("Cache-Control: max-age='
    7676                                        . $duree
    7777                                        . '"); ?' . "'.'>'";
     
    8686                        }
    8787
     88                        $concat = (trim($code) ? '.' : '');
     89
    8890                        if (strpos($pa, 'duree-')===0) {
    8991                                $methode = substr($pa, 6);
    90                                 $ajout = ".'<'.'" . '?php header("X-Spip-Methode-Duree-Cache: '.$methode.'"); ?' . "'.'>'";
    91                                 $code .= $ajout;
    92                                 spip_log ("Méthode de calcul de la durée du cache : $methode", 'cachelab');
     92                                $ajout = "'<'.'" . '?php header("X-Spip-Methode-Duree-Cache: '.$methode.'"); ?' . "'.'>'";
     93                                $code .= $concat.$ajout;
     94                                spip_log ("#CACHE avec méthode de calcul de la durée du cache : $methode", 'cachelab');
     95                                spip_log ("#CACHE avec méthode de calcul de la durée du cache : $methode  donne code=$code", 'cachelab_details');
    9396                        }
    9497
    9598                        if (strpos($pa, 'filtre-')===0) {
    9699                                $methode = substr($pa, 7);
    97                                 $ajout = ".'<'.'" . '?php header("X-Spip-Filtre-Cache: '.$methode.'"); ?' . "'.'>'";
    98                                 $code .= $ajout;
    99                                 spip_log ("Filtre sur le cache APC : $methode", 'cachelab');
     100                                $ajout = "'<'.'" . '?php header("X-Spip-Filtre-Cache: '.$methode.'"); ?' . "'.'>'";
     101                                $code .= $concat.$ajout;
     102                                spip_log ("#CACHE avec filtre sur le cache APC : $methode", 'cachelab');
     103                                spip_log ("#CACHE avec filtre sur le cache APC : $methode donne code=$code", 'cachelab_details');
    100104                        }
    101105                }
     
    165169//
    166170function cachelab_filtre_log($cache, $arg) {
    167         if (!is_array($cache) or !isset($cache['source'])) {
     171        if (!is_array($cache) or !isset($cache['source']) or !isset($cache['lastmodified']) or !isset($cache['invalideurs'])) {
    168172                spip_log ("cachelab_duree_progapprox ne reçoit pas un cache mais".print_r($cache,1), "cachelab_assert");
    169173                return null;
     
    186190        spip_log ("cache[$arg] : ".print_r($c,1), "cachelab_".$source_file);
    187191}
     192
     193//
     194// Assertions sur le fait que le cache est sessionné ou non
     195// et que l'internaute est identifié ou non
     196//
     197// Arguments possibles : oui, non, login, anonyme, log
     198// usages :
     199// #CACHE{3600, filtre-assertsession non} s'assure que les emplois sont non-sessionnés
     200// #CACHE{filtre-assertsession oui} s'assure que tous les emplois sont sessionnés
     201// #CACHE{filtre-assertsession login} s'assure que tous les emplois sont sessionnés avec un internaute identifié
     202// #CACHE{filtre-assertsession anonyme} s'assure que tous les emplois se font avec un internaute identifié
     203// Dans le cas où un assert n'est pas vérifié, un log est créé dans le fichier cachelab_assertsession
     204//
     205// Une dernière valeur de l'argument n'induit pas une assertion mais un log :
     206// #CACHE{filtre-assertsession log} crée un log avec l'état de la session pour chaque instance du cache
     207//
     208// Utile pour optimiser avec plugin macrosession et vérifier que ça se passe bien, et durablement, comme prévu
     209//
     210function cachelab_filtre_assertsession ($cache, $arg) {
     211        if (!is_array($cache) or !isset($cache['source']) or !isset($cache['lastmodified']) or !isset($cache['invalideurs'])) {
     212                spip_log ("cachelab_filtre_assertsession ne reçoit pas un cache mais".print_r($cache,1), "cachelab_assert");
     213                return null;
     214        }
     215        $source = $cache['source'];
     216        $source_file = str_replace(array('/','.'), '_', $source);
     217        $arg=trim($arg);
     218       
     219        $invalideurs = $cache['invalideurs'];
     220
     221        // on teste l'invalideur session
     222        // On pourrait aussi tester par le nom du cache avec '/_([0-9a-f]{8}|)$/i' ?
     223
     224        switch ($arg) {
     225        case 'login' :
     226                $ok = !empty($invalideurs['session']); // def et non vide
     227                break;
     228        case 'anonyme' :
     229                $ok = empty($invalideurs['session']);   // undef ou vide
     230                break;
     231        case 'oui' :
     232                $ok = isset($invalideurs['session']);   // défini, mais peut être vide
     233                break;
     234        case 'non' :
     235                $ok = !isset($invalideurs['session']);  // non défini
     236                break;
     237        case 'log' :
     238                if (!isset($invalideurs['session']))
     239                        $log = 'non';
     240                elseif ($invalideurs['session'])
     241                        $log = 'oui_login';
     242                else
     243                        $log = 'oui_anonyme';
     244                $ok = true;
     245                spip_log ("session ? $log", "cachelab_".$source_file);
     246                break;
     247        default:
     248                $ok = false;
     249                $arg .= " : valeur incorrecte";
     250                break;
     251        }
     252        if (!$ok)
     253                spip_log ("$source : assertsession n'est pas $arg. invalideurs=".print_r($invalideurs,1), "cachelab_assertsession");
     254        else
     255                spip_log ("$source : assertsession est $arg. invalideurs=".print_r($invalideurs,1), "cachelab_assertsession_ok");
     256}
Note: See TracChangeset for help on using the changeset viewer.