source: spip-zone/_plugins_/cachelab/trunk/inc/cachelab_invalideur.php @ 112666

Last change on this file since 112666 was 112666, checked in by jluc@…, 2 years ago

hint contenant le squelette sur les infos de var_cache

File size: 7.0 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) {
4        return;
5}
6include_spip('inc/cachelab_utils');
7
8/**
9 * Invalider les caches liés à telle condition
10 *
11 * Les invalideurs sont de la forme 'objet/id_objet'.
12 * La condition est géneralement "id='objet/id_objet'".
13 *
14 * Ici on se contente de noter la date de mise à jour dans les metas,
15 * pour le type d'objet en question (non utilisé cependant) et pour
16 * tout le site (sur la meta `derniere_modif`)
17 *
18 * @global derniere_modif_invalide
19 *     Par défaut à `true`, la meta `derniere_modif` est systématiquement
20 *     calculée dès qu'un invalideur se présente. Cette globale peut
21 *     être mise à `false` (aucun changement sur `derniere_modif`) ou
22 *     sur une liste de type d'objets (changements uniquement lorsqu'une
23 *     modification d'un des objets se présente).
24 *
25 * @param string $cond
26 *     Condition d'invalidation
27 * @param bool $modif
28 *     Inutilisé
29 **/
30
31
32function suivre_invalideur($cond, $modif = true) {
33        if (!$modif) {
34                return;
35        }
36       
37global $Memoization;
38static $len_prefix;
39        if (!isset($Memoization) or !$Memoization or !in_array($Memoization->methode(), array('apc', 'apcu'))) {
40                spip_log("cachelab_applique ($action, $cle...) : Memoization n'est pas activé", 'cachelab_erreur');
41                return false;
42        }
43
44        // determiner l'objet modifie : forum, article, etc
45        if (preg_match(',["\']([a-z_]+)[/"\'],', $cond, $r)) {
46                $objet = objet_type($r[1]);
47                if (!$objet) {
48                        // stocker la date_modif_extra_$extra (ne sert a rien)
49                        ecrire_meta('derniere_modif_extra_' . $r[1], time());
50                        $f="cachelab_suivre_invalideur_{$r[1]}";
51                }
52                else {
53                        // stocker la date_modif_$objet (ne sert a rien)
54                        ecrire_meta('derniere_modif_' . $objet, time());
55                        $f="cachelab_suivre_invalideur_$objet";
56                }
57                if (function_exists($f)) {
58                        spip_log ("suivre_invalideur appelle $f($cond,$modif)", "cachelab");
59                        $modif = $f($cond, $modif);      // $f renvoie la nouvelle valeur de $modif
60                        // si l'invalidation a été totalement traitée par $f, ya plus rien à faire
61                        if (!$modif)
62                                return;
63                }
64        }
65
66        // si $derniere_modif_invalide est un array('article', 'rubrique')
67        // n'affecter la meta que si c'est un de ces objets qui est modifié
68        if (is_array($GLOBALS['derniere_modif_invalide'])) {
69                if (in_array($objet, $GLOBALS['derniere_modif_invalide'])) {
70                        include_spip ('inc/cachelab');
71                        cachelab_cibler('del');
72                        spip_log ("suivre_invalideur / objet invalidant : '$objet' ($cond)", "cachelab");
73                        spip_log ("suivre_invalideur / objet invalidant : '$objet' ($cond)", "suivre_invalideur");
74                        ecrire_meta('derniere_modif', time());
75                }
76                else
77                        spip_log ("NON invalidant : $cond", "suivre_invalideur");
78
79        } // sinon, cas standard du core, toujours affecter la meta et tout effacer
80        else {
81                ecrire_meta('derniere_modif', time());
82                include_spip ('inc/cachelab');
83                cachelab_cibler('del');
84                spip_log ("suivre_invalideur standard / objet '$objet' ($cond)", "cachelab");
85                spip_log ("suivre_invalideur standard / objet '$objet' ($cond)", "suivre_invalideur");
86                // et tout effacer
87        }
88}
89
90//
91// Surcharge de maj_invalideurs
92// le core indique : "Calcul des pages : noter dans la base les liens d'invalidation"
93//
94// Appelé à la fin de creer_cache
95// $page est le tableau décrivant le cache qui vient d'être calculé
96// avec les clés suivantes pour ses métadonnées :
97// squelette,source,process_ins,invalideurs,entetes,duree,texte,notes,contexte,lastmodified,sig
98// http://code.spip.net/@maj_invalideurs
99//
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.
104//
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
110// define ('LOG_INVALIDATION_CORE', true);
111function maj_invalideurs($fichier, &$page) {
112global $Memoization;
113// Rq : ici, le texte du cache est non zipé (cf function creer_cache dans memoization),
114// tandis que la version en cache peut être zipée (avec index 'gz').
115        if  (LOG_INVALIDATION_CORE) {
116                // Abondamment appelé. À part pour pas noyer les autres
117                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");
119        };
120
121static $var_cache;
122        if (!isset($var_cache))
123                $var_cache = ((strpos(_request('var_mode'), 'cache') !== false) or _request('var_cache'));
124        $hint_squel = ($var_cache ? ' title="'.attribut_html($page['source']).'" ' : '');
125
126        // Pour le calcul dynamique d'une durée de cache, la fonction user
127        // reçoit la *valeur* de l'une des valeurs de l'environnement (par défaut "date_creation")
128        // Exemple #CACHE{1200,duree-progressive date_naissance}
129        if (isset($page['entetes']['X-Spip-Methode-Duree-Cache'])) {
130                $f = 'cachelab_duree_'.$page['entetes']['X-Spip-Methode-Duree-Cache'];
131                list ($f, $arg) = split_first_arg($f, 'date_creation');
132                if (function_exists($f)) {
133                        if (!isset($page['contexte'][$arg])) {
134                                spip_log ("#CACHE avec squelette {$page['source']} et calcul de durée avec $f mais pas de '$arg' dans le contexte ".print_r($page['contexte'],1), "cachelab_erreur");
135                                return;
136                        }
137                        $duree = $f($page['contexte'][$arg]);
138                        spip_log ("#CACHE $f ($arg={$page['contexte'][$arg]}) renvoie : $duree s", "cachelab");
139
140                        if ($var_cache)
141                                echo "<div class='inclure_blocs cachelab_blocs' $hint_squel><h6>Durée dynamique : $duree</h6></div>";
142
143                        $page['duree'] = $duree;
144                        $page['entetes']['X-Spip-Cache']=$duree;
145
146                        // On garde un souvenir
147                        // unset ($page['entetes']['X-Spip-Methode-Duree-Cache']);
148
149                        // Comme memoization, on ajoute une heure "histoire de pouvoir tourner
150                        // sur le cache quand la base de donnees est plantée (à tester)"
151                        // TODO CORE ? changer creer_cache pour qu'il appelle maj_invalideurs *avant* d'avoir écrit le cache
152                        $Memoization->set($fichier, $page, 3600+$duree);
153                }
154                else 
155                        spip_log ("#CACHE duree cache : la fonction '$f' n'existe pas (arg='$arg')\n".print_r($page,1), "cachelab_erreur");
156        }
157       
158        // Exemple : #CACHE{1200,filtre-bidouille grave} peut grave bidouiller le cache yc ses métadonnées
159        if (isset($page['entetes']['X-Spip-Filtre-Cache'])) {
160                $f = 'cachelab_filtre_'.$page['entetes']['X-Spip-Filtre-Cache'];
161                list ($f, $arg) = split_first_arg($f);
162                if (function_exists($f)) {
163                        spip_log ("#CACHE appelle le filtre $f ($arg)", "cachelab");
164                        $toset = $f($page, $arg);
165                        // Le filtre renvoie un booléen qui indique s'il faut mémoizer le cache
166                        if ($toset)
167                                $Memoization->set($fichier, $page, $cache['entete']['X-Spip-Cache']);
168                }
169                else 
170                        spip_log ("#CACHE filtre : la fonction '$f' n'existe pas (arg='$arg')\n".print_r($page,1), "cachelab_erreur");
171        }
172       
173        if ($var_cache)
174                echo '<div class="inclure_blocs cachelab_blocs" '.$hint_squel.'><h6>Sessionnement : '
175                                .cachelab_etat_sessionnement($page['invalideurs'], 'précis')
176                         .'</h6></div>';
177}
Note: See TracBrowser for help on using the repository browser.