Changeset 112591 in spip-zone


Ignore:
Timestamp:
Dec 1, 2018, 7:52:24 PM (11 days ago)
Author:
jluc@…
Message:

#CACHE : syntaxe plus sympa pour les durées dynamiques et pour les filtres sur le cache. 'session' et 'log' sont implémentés comme filtres prédéfinis.

Location:
_plugins_/cachelab/trunk
Files:
3 edited

Legend:

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

    r112520 r112591  
    11<?php
     2
     3if (!defined('_ECRIRE_INC_VERSION')) {
     4        return;
     5}
     6include_spip('inc/cachelab_utils');
    27
    38/**
     
    2429 **/
    2530
    26 if (!defined('_ECRIRE_INC_VERSION')) {
    27         return;
    28 }
    2931
    3032function suivre_invalideur($cond, $modif = true) {
     
    7981}
    8082
    81 function split_f_arg($f, $arg='') {
    82         if (strpos($f, ' ')) {
    83                 $fparts = array_filter(explode(' ',$f));
    84                 $f = array_shift($fparts);
    85                 $arg = implode(' ', $fparts);
    86         }
    87         return array ($f, $arg);
    88 }
    89 
    9083//
    9184// Surcharge de maj_invalideurs
     
    124117        if (isset($page['entetes']['X-Spip-Methode-Duree-Cache'])) {
    125118                $f = 'cachelab_duree_'.$page['entetes']['X-Spip-Methode-Duree-Cache'];
    126                 list ($f, $arg) = split_f_arg($f, 'date_creation');
     119                list ($f, $arg) = split_first_arg($f, 'date_creation');
    127120                if (function_exists($f)) {
    128121                        if (!isset($page['contexte'][$arg])) {
     
    151144        if (isset($page['entetes']['X-Spip-Filtre-Cache'])) {
    152145                $f = 'cachelab_filtre_'.$page['entetes']['X-Spip-Filtre-Cache'];
    153                 list ($f, $arg) = split_f_arg($f);
     146                list ($f, $arg) = split_first_arg($f);
    154147                if (function_exists($f)) {
    155148                        spip_log ("#CACHE appelle le filtre $f ($arg)", "cachelab");
  • _plugins_/cachelab/trunk/paquet.xml

    r112520 r112591  
    22        prefix="cachelab"
    33        categorie="outil"
    4         version="0.6.0"
     4        version="0.7.0"
    55        etat="dev"
    66        compatibilite="[3.0.0;3.2.*]"
  • _plugins_/cachelab/trunk/public/cachelab_balises.php

    r112558 r112591  
    11<?php
     2if (!defined('_ECRIRE_INC_VERSION')) {
     3        return;
     4}
     5include_spip('inc/cachelab_utils');
    26
    37/**
     
    2226 * @see memoization/public/cacher.php
    2327 * @link http://www.spip.net/4330
    24  * @example
     28 * @examples
    2529 *     ```
    2630 *     #CACHE{24*3600}
    2731 *     #CACHE{24*3600, cache-client}
    2832 *     #CACHE{0} pas de cache
    29  *     #CACHE{3600,calcul-progressif}
     33 *     ```
     34 * + Extensions par cachelab :
     35 *     ```
     36 *     #CACHE{3600,duree progressif}
     37 *     #CACHE{session, assert, non}
     38 *     #CACHE{24*3600, session}
     39 *     #CACHE{log contexte}
     40 *     #CACHE{log contexte/date_cration}
     41 *     #CACHE{log,session anonyme}
    3042 *     ```
    3143 * @note
    32  *   En absence de cette balise la durée du cache est donnée
     44 *   En absence de durée indiquée par cette balise,
     45 *   la durée du cache est donnée
    3346 *   par la constante `_DUREE_CACHE_DEFAUT`
    3447 *
     
    4457                $descr = $p->descr;
    4558                $sourcefile = $descr['sourcefile'];
     59                $code = '';
    4660
    4761                $t = trim($p->param[0][1][0]->texte);
     
    8296                                $pa = 'statique';
    8397                        }
    84 
    8598                        if ($pa == 'statique'
    8699                                and $duree > 0
    87100                        ) {
    88101                                $code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'";
    89                         }
    90 
     102                                continue;
     103                        }
     104
     105                        // il peut y avoir déjà eu, ou pas, du code
    91106                        $concat = (trim($code) ? '.' : '');
    92107
     108// ancienne syntaxe obsolète
    93109                        if (strpos($pa, 'duree-')===0) {
    94110                                $methode = substr($pa, 6);
    95111                                $ajout = "'<'.'" . '?php header("X-Spip-Methode-Duree-Cache: '.$methode.'"); ?' . "'.'>'";
    96112                                $code .= $concat.$ajout;
    97                                 spip_log ("#CACHE $sourcefile avec méthode de calcul de la durée du cache : $methode", 'cachelab');
     113                                spip_log ("#CACHE($pa) sur $sourcefile avec méthode de calcul de la durée du cache : $methode", 'cachelab_OBSOLETE');
    98114                        }
    99115
     
    102118                                $ajout = "'<'.'" . '?php header("X-Spip-Filtre-Cache: '.$methode.'"); ?' . "'.'>'";
    103119                                $code .= $concat.$ajout;
    104                                 spip_log ("#CACHE $sourcefile avec filtre sur le cache complet : $methode", 'cachelab');
     120                                spip_log ("#CACHE($pa) sur $sourcefile avec filtre sur le cache complet : $methode", 'cachelab_OBSOLETE');
     121                        }
     122// fin des syntaxes obsolètes
     123
     124                        list ($func, $args) = split_first_arg ($pa);
     125                        switch ($func) {
     126                        // TODO : également traiter ici les morceaux du core traités plus haut
     127                        case 'statique' :
     128                        case 'duree' :
     129                                $ajout = "'<'.'" . "?php header(\"X-Spip-Methode-Duree-Cache: $args\"); ?" . "'.'>'";
     130                                $code .= $concat.$ajout;
     131                                spip_log ("#CACHE{$pa} sur $sourcefile avec méthode de calcul de la durée du cache : $args", 'cachelab');
     132                                break;
     133                       
     134                        case 'log' :
     135                        case 'session' :
     136                        case 'filtre' :
     137                                $ajout = "'<'.'" . '?php header("X-Spip-Filtre-Cache: '.$pa.'"); ?' . "'.'>'";
     138                                $code .= $concat.$ajout;
     139                                spip_log ("#CACHE{$pa} sur $sourcefile : filtre  $func($args) sur le cache complet", 'cachelab');
     140                                break;
     141                        default :
     142                                break;
    105143                        }
    106144                }
     
    127165// et "posté il y a 3 mois" ou "il y a 2 ans", bien suffisant en général.
    128166//
    129 // usage : #CACHE{3600, duree-progapprox} ou #CACHE{3600, duree-progapprox date_naissance}
     167// usage : #CACHE{3600, duree progapprox} ou #CACHE{3600, duree-progapprox date_naissance}
    130168//
    131169function cachelab_duree_progapprox($date_creation) {
     
    164202//
    165203// Exemples d'usages :
    166 //      #CACHE{3600, filtre-log} : log tout le cache, méta et html
    167 //      #CACHE{filtre-log lastmodified}  : log l'entrée lastmodified du cache
    168 //      #CACHE{filtre-log contexte} : log tout le tableau d'environnement
    169 //  #CACHE{filtre-log contexte/date_creation} : log l'entrée 'date_creation' de l'environnement
     204//      #CACHE{3600,log} : log tout le cache, méta et html
     205//      #CACHE{log lastmodified}  : log l'entrée lastmodified du cache
     206//      #CACHE{log contexte} : log tout le tableau d'environnement
     207//  #CACHE{log contexte/date_creation} : log l'entrée 'date_creation' de l'environnement
    170208//
    171209function cachelab_filtre_log($cache, $arg) {
     
    192230}
    193231
     232
    194233//
    195234// Assertions sur le fait que le cache est sessionné ou non
     
    198237// Arguments possibles : oui, non, login, anonyme, log
    199238// usages :
    200 // #CACHE{3600, filtre-assertsession non} s'assure que les emplois sont non-sessionnés
    201 // #CACHE{filtre-assertsession oui} s'assure que tous les emplois sont sessionnés
    202 // #CACHE{filtre-assertsession login} s'assure que tous les emplois sont sessionnés avec un internaute identifié
    203 // #CACHE{filtre-assertsession anonyme} s'assure que tous les emplois sans internaute identifié
     239// #CACHE{3600, session assert non} s'assure que les emplois sont non-sessionnés
     240// #CACHE{session assert oui} s'assure que tous les emplois sont sessionnés
     241// #CACHE{session assert login} s'assure que tous les emplois sont sessionnés avec un internaute identifié
     242// #CACHE{session assert anonyme} s'assure que tous les emplois sans internaute identifié
    204243// Dans le cas où un assert n'est pas vérifié, un log est créé dans le fichier cachelab_assertsession
    205244//
    206 // Une dernière valeur de l'argument n'induit pas une assertion mais un log :
    207 // #CACHE{filtre-assertsession log} crée un log avec l'état de la session pour chaque instance du cache
    208 //
    209 // Utile pour optimiser avec plugin macrosession et vérifier que ça se passe bien, et durablement, comme prévu
    210 //
    211 function cachelab_filtre_assertsession (&$cache, $arg) {
     245// Utile pour vérifier que le sessionnement se passe bien, et durablement, comme prévu
     246// et optimiser avec un bon découpage des noisettes et avec macrosession
     247//
     248function cachelab_filtre_session (&$cache, $totarg) {
    212249        if (!is_array($cache) or !isset($cache['source']) or !isset($cache['lastmodified']) or !isset($cache['invalideurs'])) {
    213250                spip_log ("cachelab_filtre_assertsession ne reçoit pas un cache mais".print_r($cache,1), "cachelab_assert");
     
    216253        $source = $cache['source'];
    217254        $source_file = str_replace(array('/','.'), '_', $source);
    218         $arg=trim($arg);
     255        list($func, $what) = split_first_arg($totarg);
    219256       
    220257        $invalideurs = $cache['invalideurs'];
    221258
    222         // on teste l'invalideur session
    223         // On pourrait aussi tester par le nom du cache avec '/_([0-9a-f]{8}|)$/i' ?
    224 
    225         switch ($arg) {
    226         case 'login' :
    227                 $ok = !empty($invalideurs['session']); // def et non vide
     259        if (!isset($invalideurs['session']))
     260                $sess = 'non';
     261        elseif ($invalideurs['session'])
     262                $sess = 'oui_login';
     263        else
     264                $sess = 'oui_anonyme';
     265
     266        switch ($func) {
     267                case 'assert' :
     268                        switch($what) {
     269                                case 'oui_login' :
     270                                case 'oui_anonyme' :
     271                                case 'non' :
     272                                        $ok = ($sess==$what);
     273                                        break;
     274                                case 'anonyme' :
     275                                        $ok = empty($invalideurs['session']);   // oui_anonyme ou non
     276                                        break;
     277                                case 'oui' :
     278                                        $ok = isset($invalideurs['session']);   // oui_anonyme ou oui_login
     279                                        break;
     280                                default:
     281                                        spip_log ("Erreur de syntaxe : '$what' incorrect dans #CACHE{session $totarg}, il faut oui, login, non ou anonyme", 'cachelab_erreur');
     282                                        break 2;
     283                        }
     284                        if (!$ok)
     285                                spip_log ("$source : session n'est pas '$what'. invalideurs=".print_r($invalideurs,1), "cachelab_assertsession");
     286                        break;
     287        case 'debug' : // debug est OBSOLETE
     288                spip_log ("#CACHE{session debug}", "cachelab_OBSOLETE");
     289                // nobreak;
     290        case 'insert' :
     291                $cache['texte'] .= '<'."?php echo '<div class=\"debug cachelab\">$source_file sessionné : $sess</div>' ?>";
     292                $cache['process_ins'] = 'php';
    228293                break;
    229         case 'anonyme' :
    230                 $ok = empty($invalideurs['session']);   // undef ou vide
     294        case 'echo' :
     295                echo "<div class='debug cachelab'>$source_file sessionné : $log</div>";
    231296                break;
    232         case 'oui' :
    233                 $ok = isset($invalideurs['session']);   // défini, mais peut être vide
     297        case 'log' :
     298                spip_log ("session : $sess", "cachelab_".$source_file);
    234299                break;
    235         case 'non' :
    236                 $ok = !isset($invalideurs['session']);  // non défini
     300        default :
     301                spip_log ("Syntaxe incorrecte dans $source_file : $func inconnu dans #CACHE{session $totarg}", 'cachelab_erreur');
    237302                break;
    238         case 'debug' :
    239         case 'echo' :
    240         case 'log' :
    241                 if (!isset($invalideurs['session']))
    242                         $log = 'non';
    243                 elseif ($invalideurs['session'])
    244                         $log = 'oui_login';
    245                 else
    246                         $log = 'oui_anonyme';
    247                 $ok = true;
    248                 switch ($arg) {
    249                 case 'log' :
    250                         spip_log ("session ? $log", "cachelab_".$source_file);
    251                         break;
    252                 case 'echo' :
    253                         echo "<div class='debug cachelab'>$source_file sessionné ? $log</div>";
    254                         break;
    255                 case 'debug' :
    256                         $cache['texte'] .= '<'."?php echo '<div class=\"debug cachelab\" style=\"background-color:yellow\">$source_file sessionné ? $log</div>' ?>";
    257                         $cache['process_ins'] = 'php';
    258                         break;
    259                 };
    260         default:
    261                 $ok = false;
    262                 $arg .= " : valeur incorrecte";
    263                 break;
    264         }
    265         if (!$ok)
    266                 spip_log ("$source : assertsession n'est pas '$arg'. invalideurs=".print_r($invalideurs,1), "cachelab_assertsession");
    267 }
     303        }
     304}
Note: See TracChangeset for help on using the changeset viewer.