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

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

cachelab_filtre devient cachelab_cibler pour éviter confusion avec les #CACHE{filtre-qqchose args}

File size: 6.3 KB
Line 
1<?php
2
3/**
4 * Invalider les caches liés à telle condition
5 *
6 * Les invalideurs sont de la forme 'objet/id_objet'.
7 * La condition est géneralement "id='objet/id_objet'".
8 *
9 * Ici on se contente de noter la date de mise à jour dans les metas,
10 * pour le type d'objet en question (non utilisé cependant) et pour
11 * tout le site (sur la meta `derniere_modif`)
12 *
13 * @global derniere_modif_invalide
14 *     Par défaut à `true`, la meta `derniere_modif` est systématiquement
15 *     calculée dès qu'un invalideur se présente. Cette globale peut
16 *     être mise à `false` (aucun changement sur `derniere_modif`) ou
17 *     sur une liste de type d'objets (changements uniquement lorsqu'une
18 *     modification d'un des objets se présente).
19 *
20 * @param string $cond
21 *     Condition d'invalidation
22 * @param bool $modif
23 *     Inutilisé
24 **/
25
26if (!defined('_ECRIRE_INC_VERSION')) {
27        return;
28}
29
30function suivre_invalideur($cond, $modif = true) {
31        if (!$modif) {
32                return;
33        }
34
35        // determiner l'objet modifie : forum, article, etc
36        if (preg_match(',["\']([a-z_]+)[/"\'],', $cond, $r)) {
37                $objet = objet_type($r[1]);
38                if (!$objet) {
39                        // stocker la date_modif_extra_$extra (ne sert a rien)
40                        ecrire_meta('derniere_modif_extra_' . $r[1], time());
41                        $f="cachelab_suivre_invalideur_{$r[1]}";
42                }
43                else {
44                        // stocker la date_modif_$objet (ne sert a rien)
45                        ecrire_meta('derniere_modif_' . $objet, time());
46                        $f="cachelab_suivre_invalideur_$objet";
47                }
48                if (function_exists($f)) {
49                        spip_log ("suivre_invalideur appelle $f($cond,$modif)", "cachelab");
50                        $modif = $f($cond, $modif);      // $f renvoie la nouvelle valeur de $modif
51                        // si l'invalidation a été totalement traitée par $f, ya plus rien à faire
52                        if (!$modif)
53                                return;
54                }
55        }
56
57        // si $derniere_modif_invalide est un array('article', 'rubrique')
58        // n'affecter la meta que si c'est un de ces objets qui est modifié
59        if (is_array($GLOBALS['derniere_modif_invalide'])) {
60                if (in_array($objet, $GLOBALS['derniere_modif_invalide'])) {
61                        include_spip ('inc/cachelab');
62                        cachelab_cibler('del');
63                        spip_log ("suivre_invalideur / objet invalidant : '$objet' ($cond)", "cachelab");
64                        spip_log ("suivre_invalideur / objet invalidant : '$objet' ($cond)", "suivre_invalideur");
65                        ecrire_meta('derniere_modif', time());
66                }
67                else
68                        spip_log ("NON invalidant : $cond", "suivre_invalideur");
69
70        } // sinon, cas standard du core, toujours affecter la meta et tout effacer
71        else {
72                ecrire_meta('derniere_modif', time());
73                include_spip ('inc/cachelab');
74                cachelab_cibler('del');
75                spip_log ("suivre_invalideur standard / objet '$objet' ($cond)", "cachelab");
76                spip_log ("suivre_invalideur standard / objet '$objet' ($cond)", "suivre_invalideur");
77                // et tout effacer
78        }
79}
80
81function 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
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
121        // Pour le calcul dynamique d'une durée de cache, la fonction user
122        // reçoit la *valeur* de l'une des valeurs de l'environnement (par défaut "date_creation")
123        // Exemple #CACHE{1200,duree-progressive date_naissance}
124        if (isset($page['entetes']['X-Spip-Methode-Duree-Cache'])) {
125                $f = 'cachelab_duree_'.$page['entetes']['X-Spip-Methode-Duree-Cache'];
126                list ($f, $arg) = split_f_arg($f, 'date_creation');
127                if (function_exists($f)) {
128                        if (!isset($page['contexte'][$arg])) {
129                                spip_log ("#CACHE avec squelette {$page['source']} et calcul durée avec $f mais pas de '$args' dans le contexte ".print_r($page['contexte'],1), "cachelab_erreur");
130                                return;
131                        }
132                        $duree = $f($page['contexte'][$arg]);
133                        spip_log ("#CACHE $f ($arg={$page['contexte'][$arg]}) renvoie : $duree s", "cachelab");
134
135                        $page['duree'] = $duree;
136                        $page['entetes']['X-Spip-Cache']=$duree;
137
138                        // On garde un souvenir
139                        // unset ($page['entetes']['X-Spip-Methode-Duree-Cache']);
140
141                        // Comme memoization, on ajoute une heure "histoire de pouvoir tourner
142                        // sur le cache quand la base de donnees est plantée (à tester)"
143                        // TODO CORE ? changer creer_cache pour qu'il appelle maj_invalideurs *avant* d'avoir écrit le cache
144                        $Memoization->set($fichier, $page, 3600+$duree);
145                }
146                else 
147                        spip_log ("#CACHE duree cache : la fonction '$f' n'existe pas (arg='$arg')\n".print_r($page,1), "cachelab_erreur");
148        }
149       
150        // Exemple : #CACHE{1200,filtre-bidouille grave} peut grave bidouiller le cache yc ses métadonnées
151        if (isset($page['entetes']['X-Spip-Filtre-Cache'])) {
152                $f = 'cachelab_filtre_'.$page['entetes']['X-Spip-Filtre-Cache'];
153                list ($f, $arg) = split_f_arg($f);
154                if (function_exists($f)) {
155                        spip_log ("#CACHE appelle le filtre $f ($arg)", "cachelab");
156                        $f($page, $arg);
157                        // ici rien de plus, c'est le filtre qui fait ce qu'il veut
158                        // et qui peut enregistrer le résulat
159                }
160                else 
161                        spip_log ("#CACHE filtre : la fonction '$f' n'existe pas (arg='$arg')\n".print_r($page,1), "cachelab_erreur");
162        }
163}
Note: See TracBrowser for help on using the repository browser.