Changeset 112499 in spip-zone


Ignore:
Timestamp:
Nov 21, 2018, 12:55:02 PM (4 weeks ago)
Author:
root
Message:

premier filtre exemple sur les caches : log de tout ou d'une entrée + déplacement de la durée progapprox

Location:
_plugins_/cachelab/trunk
Files:
3 edited

Legend:

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

    r112487 r112499  
    152152        }
    153153}
    154 
    155 //
    156 // Exemple de durée de cache dynamique
    157 //
    158 // Renvoie une durée de cache trés courte pour les caches frais
    159 // et de plus en plus longue au fur et à mesure que le cache vieillit
    160 // Ainsi on peut écrire un filtre assurant un affichage approximatif
    161 // et permettre à la fois d'afficher "posté il y a 16 secondes", bien précis,
    162 // et "posté il y a 3 mois" ou "il y a 2 ans", bien suffisant en général.
    163 //
    164 function cachelab_duree_progapprox($date_creation) {
    165         $dt_creation = new DateTime($date_creation);
    166         if (!$dt_creation)
    167                 return _DUREE_CACHE_DEFAUT;
    168 
    169         $interval = $dt_creation->diff(new DateTime('NOW'),true); // valeur absolue
    170         if (!$interval)
    171                 return _DUREE_CACHE_DEFAUT;
    172         if ($interval->y > 2)
    173                 return 6*30*24*3600; // 6 mois si plus de 2 ans
    174         if ($interval->y)
    175                 return 30*24*3600;      // 1 mois si plus d'un an
    176         if ($interval->m)
    177                 return 7*24*3600;       // 1 semaine si plus d'un mois
    178         if ($interval->d > 7)
    179                 return 24*3600;         // 1 jour si plus d'une semaine
    180         if ($interval->d)
    181                 return 6*3600;          // 6h si plus d'un jour
    182         if ($interval->h > 6)
    183                 return 3600;            // 1h si plus de 6h
    184         if ($interval->h)
    185                 return 30*60;           // 1/2h si plus d'1h
    186         if ($interval->i > 10)
    187                 return 10*60;           // 10 minutes si plus de 10 minutes
    188         if ($interval->i)
    189                 return 60;                      // chaque minute si plus d'une minute
    190         return 10;                              // 10secondes si moins d'une minute
    191 }
  • _plugins_/cachelab/trunk/paquet.xml

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

    r112168 r112499  
    3939 **/
    4040function balise_CACHE ($p) {
    41         if ($p->param) { 
    42                 $duree = valeur_numerique($pd = $p->param[0][1][0]->texte);
     41        if ($p->param) {
     42                $i = 0;
    4343
    44                 // noter la duree du cache dans un entete proprietaire
    45                 $code = "'<'.'" . '?php header("X-Spip-Cache: '
    46                         . $duree
    47                         . '"); ?' . "'.'>'";
     44                $t = trim($p->param[0][1][0]->texte);
     45                if (_request('debug')) echo "t=$t<br>";
     46                if (preg_match(',^[0-9],', $t)) {
     47                        $duree = valeur_numerique($pd = $p->param[0][1][0]->texte);
    4848
    49                 // Remplir le header Cache-Control
    50                 // cas #CACHE{0}
    51                 if ($duree == 0) {
    52                         $code .= ".'<'.'"
    53                                 . '?php header("Cache-Control: no-cache, must-revalidate"); ?'
    54                                 . "'.'><'.'"
    55                                 . '?php header("Pragma: no-cache"); ?'
    56                                 . "'.'>'";
     49                        // noter la duree du cache dans un entete proprietaire
     50                        $code = "'<'.'" . '?php header("X-Spip-Cache: '
     51                                . $duree
     52                                . '"); ?' . "'.'>'";
     53
     54                        // Remplir le header Cache-Control
     55                        // cas #CACHE{0}
     56                        if ($duree == 0) {
     57                                $code .= ".'<'.'"
     58                                        . '?php header("Cache-Control: no-cache, must-revalidate"); ?'
     59                                        . "'.'><'.'"
     60                                        . '?php header("Pragma: no-cache"); ?'
     61                                        . "'.'>'";
     62                        }
     63                        ++$i;
    5764                }
     65                elseif (_request('debug'))
     66                        echo "t=$t<br>";
    5867
    5968                // recuperer les parametres suivants
    60                 $i = 1;
    6169                while (isset($p->param[0][++$i])) {
    6270                        $pa = ($p->param[0][$i][0]->texte);
     
    100108        return $p;
    101109}
     110
     111
     112//
     113// Calcul de durée de cache dynamique progressive
     114// adapté pour un affichage approximatif et habituel
     115// du type "il y a 20 secondes", "il y a 3 minutes", "ce matin",
     116// "hier soir", "la semaine dernière" ou "il y a 3 mois"
     117//
     118// Renvoie une durée de cache trés courte pour les caches frais
     119// et de plus en plus longue au fur et à mesure que le cache vieillit
     120// Ainsi on peut écrire un filtre assurant un affichage approximatif
     121// et permettre à la fois d'afficher "posté il y a 16 secondes", bien précis,
     122// et "posté il y a 3 mois" ou "il y a 2 ans", bien suffisant en général.
     123//
     124// usage : #CACHE{3600, duree-progapprox} ou #CACHE{3600, duree-progapprox date_naissance}
     125//
     126function cachelab_duree_progapprox($date_creation) {
     127        $dt_creation = new DateTime($date_creation);
     128        if (!$dt_creation)
     129                return _DUREE_CACHE_DEFAUT;
     130
     131        $interval = $dt_creation->diff(new DateTime('NOW'),true); // valeur absolue
     132        if (!$interval)
     133                return _DUREE_CACHE_DEFAUT;
     134        if ($interval->y > 2)
     135                return 6*30*24*3600; // 6 mois si plus de 2 ans
     136        if ($interval->y)
     137                return 30*24*3600;      // 1 mois si plus d'un an
     138        if ($interval->m)
     139                return 7*24*3600;       // 1 semaine si plus d'un mois
     140        if ($interval->d > 7)
     141                return 24*3600;         // 1 jour si plus d'une semaine
     142        if ($interval->d)
     143                return 6*3600;          // 6h si plus d'un jour
     144        if ($interval->h > 6)
     145                return 3600;            // 1h si plus de 6h
     146        if ($interval->h)
     147                return 30*60;           // 1/2h si plus d'1h
     148        if ($interval->i > 10)
     149                return 10*60;           // 10 minutes si plus de 10 minutes
     150        if ($interval->i)
     151                return 60;                      // chaque minute si plus d'une minute
     152        return 10;                              // 10secondes si moins d'une minute
     153}
     154
     155//
     156// Log tout ou un élément contenu par le tableau de cache
     157// dans un fichier de log dont le nom reprend le chemin du squelette
     158// (avec les / remplacés par des _)
     159//
     160// Exemples d'usages :
     161//      #CACHE{3600, filtre-log} : log tout le cache, méta et html
     162//      #CACHE{filtre-log lastmodified}  : log l'entrée lastmodified du cache
     163//      #CACHE{filtre-log contexte} : log tout le tableau d'environnement
     164//  #CACHE{filtre-log contexte/date_creation} : log l'entrée 'date_creation' de l'environnement
     165//
     166function cachelab_filtre_log($cache, $arg) {
     167        if (!is_array($cache) or !isset($cache['source'])) {
     168                spip_log ("cachelab_duree_progapprox ne reçoit pas un cache mais".print_r($cache,1), "cachelab_assert");
     169                return null;
     170        }
     171        $source = $cache['source'];
     172        $source_file = str_replace(array('/','.'), '_', $source);
     173        $arg=trim($arg);
     174        if ($arg) {
     175                if (strpos($arg, '/')) {
     176                        $ij=explode('/',$arg);
     177                        $c = $cache[$i=trim(array_shift($ij))];
     178                        $c = $c[trim($j=array_shift($ij))];
     179                }
     180                else {
     181                        $c = $cache[$arg];
     182                }
     183        }
     184        else
     185                $c = $cache;
     186        spip_log ("cache[$arg] : ".print_r($c,1), "cachelab_".$source_file);
     187}
Note: See TracChangeset for help on using the changeset viewer.