Changeset 111837 in spip-zone


Ignore:
Timestamp:
Oct 3, 2018, 9:46:25 PM (14 months ago)
Author:
jluc@…
Message:

Extensibilité : on peut définir des filtrages spécifiques plus complexes sur les caches, pour les besoins d'un site.\n Exemple implémenté dans le plugin : le filtrage par contexte multiple.

Location:
_plugins_/cachelab/trunk
Files:
2 edited

Legend:

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

    r111828 r111837  
    7373        $chemin = (isset($conditions['chemin']) ? $conditions['chemin'] : null);
    7474        $chemins = explode('|', $chemin); // sert seulement pour methode_chemin == strpos
    75 
    7675        $cle_objet = (isset($conditions['cle_objet']) ? $conditions['cle_objet'] : null);
    7776        $id_objet = (isset($conditions['id_objet']) ? $conditions['id_objet'] : null);
    7877        if ($cle_objet and !$id_objet)
    7978                die ("$cle_objet est inconnu : passez le en argument d'url ou définissez XRAY_ID_OBJET_SPECIAL en php");
     79        // pour 'contexte' on simule un 'more' pour donner un exemple d'extension
     80        if (isset($conditions['contexte']) and $conditions['contexte'] and !isset($conditions['more']))
     81                $conditions['more'] = 'contexte';
     82        if ($more = (isset($conditions['more']) ? (string)$conditions['more'] : '')) {
     83                $morefunc='cachelab_filtrecache_'.$more;
     84                // Signature nécessaire : $morefunc ($action, $conditions, $options, &$stats)
     85                if (!function_exists($morefunc))
     86                        die ("La fonction '$morefunc' n'est pas définie");
     87        }
    8088
    8189        // options
    8290        $methode_chemin = (isset ($options['methode_chemin']) ? $options['methode_chemin'] : 'strpos');
    83         $do_clean = ($action != 'pass') and (!isset ($options['clean']) or $options['clean']);
    84         $do_lists = ($action != 'list') or (isset ($options['listes']) and $options['listes']);
    85         $do_chrono = (isset ($options['chrono']) and $options['chrono']);
     91        $do_clean = ($action != 'pass') and (!isset ($options['clean']) or $options['clean']);  // clean par défaut
     92        $do_lists = ($action == 'list') or (isset ($options['list']) and $options['list']);             // pas de listes par défaut
     93        $do_chrono = (isset ($options['chrono']) and $options['chrono']);                                               // pas de chrono par défaut
    8694        if ($do_chrono) {
    8795                include_spip ('lib/microtime.inc');
    8896                microtime_do ('begin');
    8997        }
     98       
    9099        // retours
    91         $nb_alien=$nb_site=$nb_clean=$nb_no_data=$nb_not_array=$nb_cible=0;
    92         $nb_session=($session ? 0 : '_');
    93         $nb_chemin=($chemin ? 0 : '_');
    94         $l_session = $l_chemin = $l_no_data = $l_not_array = $l_cible = array();
    95 
    96         $len_prefix = strlen(_CACHE_NAMESPACE);
     100        $stats=array();
     101        $stats['nb_alien']=$stats['nb_site']=$stats['nb_clean']=$stats['nb_no_data']=$stats['nb_not_array']=$stats['nb_cible']=0;
     102        $stats['l_no_data'] = $stats['l_not_array'] = $stats['l_cible'] = array();
     103
     104        // On y va
    97105        $cache = apcu_cache_info();
    98106        $meta_derniere_modif = lire_meta('derniere_modif');
    99        
     107        $len_prefix = strlen(_CACHE_NAMESPACE);
     108
    100109        foreach($cache['cache_list'] as $i => $d) {
     110                // on "continue=passe au suivant" dés qu'on sait que le cache n'est pas cible
     111
    101112                $cle = $d['info'];
     113
    102114                // on saute les caches d'autres origines
    103115                // (et les caches d'un précédent _CACHE_NAMESPACE pour ce même site)
    104116                if (strpos ($cle, _CACHE_NAMESPACE) !== 0) {
    105                         $nb_alien++;
    106                         continue;
    107                 }
    108 
    109                 if ((substr($cle, $len_prefix-1, 7) == ':cache:')
    110                         and  apcu_exists($cle)
    111                         ) {
    112                         // effacer les caches périmés
    113                         if ($do_clean and ($meta_derniere_modif > $d['creation_time'])) {
     117                        $stats['nb_alien']++;
     118                        continue;
     119                }
     120
     121                // on ne veut examiner que les caches de squelettes SPIP
     122                if ((substr($cle, $len_prefix-1, 7) != ':cache:')
     123                        or !apcu_exists($cle))
     124                        continue;
     125
     126                // effacer ou au moins sauter les caches périmés
     127                if ($meta_derniere_modif > $d['creation_time']) {
     128                        if ($do_clean) {
    114129                                $Memoization->del(substr($cle,$len_prefix));
    115                                 $nb_clean++;
     130                                $stats['nb_clean']++;
     131                        };
     132                        continue;
     133                }
     134
     135                // caches SPIP véritablement candidats
     136                $stats['nb_candidats']++;
     137
     138                if ($session) {
     139                        if (substr ($cle, -9) != "_$session")
     140                                continue;
     141                }
     142
     143                if ($chemin) {
     144                        switch ($methode_chemin) {
     145                        case 'strpos' :
     146                                foreach ($chemins as $unchemin)
     147                                        if ($unchemin and (strpos ($cle, $unchemin) !== false))
     148                                                break;
     149                                continue 2;
     150                        case 'regexp' :
     151                                if ($chemin and ($danslechemin = preg_match(",$chemin,i", $cle)))
     152                                        break;
     153                                continue 2;
     154                        default :
     155                                die("Méthode pas prévue pour le filtrage par le chemin");
     156                        };
     157                }
     158
     159                // récupérer le contenu du cache
     160                if (($cle_objet and $id_objet) or $morefunc) {
     161                        global $Memoization;
     162                        $data = $Memoization->get(substr($cle, $len_prefix));
     163                        if (!$data) {
     164                                $stats['nb_no_data']++;
    116165                                continue;
    117166                        }
    118 
    119                         // caches candidats
    120                         $nb_site++;
    121 
    122                         if ($session) {
    123                                 if (substr ($cle, -9) != "_$session")
    124                                         continue;
    125                                 else {
    126                                         $nb_session++;
    127                                         if ($do_lists)
    128                                                 $l_session[]=$cle;
    129                                 }
    130                         }
    131 
    132                         if ($chemin) {
    133                                 switch ($methode_chemin) {
    134                                 case 'strpos' :
    135                                         foreach ($chemins as $unchemin)
    136                                                 if ($unchemin and (strpos ($cle, $unchemin) !== false))
    137                                                         break;
    138                                         continue 2;
    139                                 case 'regexp' :
    140                                         if ($chemin and ($danslechemin = preg_match(",$chemin,i", $cle)))
    141                                                 break;
    142                                         continue 2;
    143                                 default :
    144                                         die("Méthode pas prévue pour le filtrage par le chemin");
    145                                 };
    146                                 $nb_chemin++;
     167                        if (!is_array($data)) {
     168                                spip_log ("clé=$cle : data n'est pas un tableau : ".print_r($data,1), 'cachelab');
     169                                $stats['nb_not_array']++;
    147170                                if ($do_lists)
    148                                         $l_chemin[]=$cle;
    149                         }
    150 
    151                         if ($cle_objet and $id_objet) {
    152                                 global $Memoization;
    153                                 $data = $Memoization->get(substr($cle, $len_prefix));
    154                                 if (!$data) {
    155                                         $nb_no_data++;
    156                                         continue;
    157                                 }
    158                                 if (!is_array($data)) {
    159                                         spip_log ("clé=$cle : data n'est pas un tableau : ".print_r($data,1), 'cachelab');
    160                                         $nb_not_array++;
    161                                         if ($do_lists)
    162                                                 $l_not_array[] = $cle;
    163                                         continue;
    164                                 };
    165                                 if (!isset ($data['contexte'][$cle_objet])
    166                                         or ($data['contexte'][$cle_objet]!=$id_objet))
    167                                         continue;
    168                         }
    169                         // restent les cibles
    170                         $nb_cible++;
    171                         if ($do_lists)
    172                                 $l_cible[] = $cle;
    173                         cachelab_applique ($action, $cle, null, $options);
    174                 }
    175         }
    176 
    177         $stats = array(
    178                 'nb_alien'=>$nb_alien,
    179                 'nb_site'=>$nb_site,
    180                 'nb_clean'=>$nb_clean,
    181                 'nb_session'=>$nb_session,
    182                 'nb_chemin'=>$nb_chemin,
    183                 'nb_no_data' => $nb_no_data,    // yen a (kesako ?)
    184                 'nb_not_array' => $nb_not_array, // 0 normalement
    185                 'nb_cible'=>$nb_cible
    186         );
    187 
    188         if ($do_lists) {
    189                 $stats['liste_matche_chemin'] = $l_chemin;
    190                 $stats['liste_data_not_array'] = $l_not_array;
    191                 $stats['liste_cible'] = $l_cible;
     171                                        $stats['l_not_array'][] = $cle;
     172                                continue;
     173                        };
     174                };
     175
     176                if ($cle_objet
     177                        and (!isset ($data['contexte'][$cle_objet])
     178                                or ($data['contexte'][$cle_objet]!=$id_objet)))
     179                        continue;
     180
     181                if ($morefunc
     182                        and !$morefunc ($action, $conditions, $options, $cle, $data, $stats))
     183                        continue;
     184
     185                // restent les cibles
     186                $stats['nb_cible']++;
     187                if ($do_lists)
     188                        $stats['l_cible'][] = $cle;
     189                cachelab_applique ($action, $cle, null, $options);
    192190        }
    193191
     
    216214        }
    217215}
     216
     217function cachelab_filtrecache_contexte($action, $conditions, $options, $cle, $data, $stats) {
     218        if (!isset ($data['contexte'])
     219                or !isset($conditions['contexte'])
     220                or !is_array($conditions['contexte']))
     221                return false;
     222        $diff = array_diff_assoc($conditions['contexte'], $data['contexte']);
     223        return empty($diff);
     224}
  • _plugins_/cachelab/trunk/paquet.xml

    r111828 r111837  
    22        prefix="cachelab"
    33        categorie="outil"
    4         version="0.0.4"
     4        version="0.0.5"
    55        etat="dev"
    66        compatibilite="[3.0.0;3.2.*]"
Note: See TracChangeset for help on using the changeset viewer.