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

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

#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.

File size: 6.2 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
37        // determiner l'objet modifie : forum, article, etc
38        if (preg_match(',["\']([a-z_]+)[/"\'],', $cond, $r)) {
39                $objet = objet_type($r[1]);
40                if (!$objet) {
41                        // stocker la date_modif_extra_$extra (ne sert a rien)
42                        ecrire_meta('derniere_modif_extra_' . $r[1], time());
43                        $f="cachelab_suivre_invalideur_{$r[1]}";
44                }
45                else {
46                        // stocker la date_modif_$objet (ne sert a rien)
47                        ecrire_meta('derniere_modif_' . $objet, time());
48                        $f="cachelab_suivre_invalideur_$objet";
49                }
50                if (function_exists($f)) {
51                        spip_log ("suivre_invalideur appelle $f($cond,$modif)", "cachelab");
52                        $modif = $f($cond, $modif);      // $f renvoie la nouvelle valeur de $modif
53                        // si l'invalidation a été totalement traitée par $f, ya plus rien à faire
54                        if (!$modif)
55                                return;
56                }
57        }
58
59        // si $derniere_modif_invalide est un array('article', 'rubrique')
60        // n'affecter la meta que si c'est un de ces objets qui est modifié
61        if (is_array($GLOBALS['derniere_modif_invalide'])) {
62                if (in_array($objet, $GLOBALS['derniere_modif_invalide'])) {
63                        include_spip ('inc/cachelab');
64                        cachelab_cibler('del');
65                        spip_log ("suivre_invalideur / objet invalidant : '$objet' ($cond)", "cachelab");
66                        spip_log ("suivre_invalideur / objet invalidant : '$objet' ($cond)", "suivre_invalideur");
67                        ecrire_meta('derniere_modif', time());
68                }
69                else
70                        spip_log ("NON invalidant : $cond", "suivre_invalideur");
71
72        } // sinon, cas standard du core, toujours affecter la meta et tout effacer
73        else {
74                ecrire_meta('derniere_modif', time());
75                include_spip ('inc/cachelab');
76                cachelab_cibler('del');
77                spip_log ("suivre_invalideur standard / objet '$objet' ($cond)", "cachelab");
78                spip_log ("suivre_invalideur standard / objet '$objet' ($cond)", "suivre_invalideur");
79                // et tout effacer
80        }
81}
82
83//
84// Surcharge de maj_invalideurs
85// le core indique : "Calcul des pages : noter dans la base les liens d'invalidation"
86//
87// Appelé à la fin de creer_cache
88// $page est le tableau décrivant le cache qui vient d'être calculé
89// avec les clés suivantes pour ses métadonnées :
90// squelette,source,process_ins,invalideurs,entetes,duree,texte,notes,contexte,lastmodified,sig
91// http://code.spip.net/@maj_invalideurs
92//
93// S'il y a une entete X-Spip-Methode-Duree-Cache on récupère la méthode
94// et on appelle la fonction cachelab_calcule_duree_cache_lamethode
95// avec en argument la valeur de l'argument dans l'envt ou de date_creation par défaut
96// On corrige alors la durée du cache avec la valeur retournée.
97//
98// S'il y a une entete X-Spip-Filtre-Cache on récupère le filtre
99// et on l'appelle avec le cache entier en argument
100// Le filtre peut modifier n'importe quelle partie du cache, métadonnée ou résultat de compilation.
101//
102
103// define ('LOG_INVALIDATION_CORE', true);
104function maj_invalideurs($fichier, &$page) {
105global $Memoization;
106// Rq : ici, le texte du cache est non zipé (cf function creer_cache dans memoization),
107// tandis que la version en cache peut être zipée (avec index 'gz').
108        if  (LOG_INVALIDATION_CORE) {
109                // Abondamment appelé. À part pour pas noyer les autres
110                spip_log ("maj_invalideurs($fichier, &page)", "invalideur_core_maj_invalideurs");
111                spip_log ("maj_invalideurs($fichier, &page)\n".print_r($page,1), "invalideur_core_maj_invalideurs_details");
112        }
113
114        // Pour le calcul dynamique d'une durée de cache, la fonction user
115        // reçoit la *valeur* de l'une des valeurs de l'environnement (par défaut "date_creation")
116        // Exemple #CACHE{1200,duree-progressive date_naissance}
117        if (isset($page['entetes']['X-Spip-Methode-Duree-Cache'])) {
118                $f = 'cachelab_duree_'.$page['entetes']['X-Spip-Methode-Duree-Cache'];
119                list ($f, $arg) = split_first_arg($f, 'date_creation');
120                if (function_exists($f)) {
121                        if (!isset($page['contexte'][$arg])) {
122                                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");
123                                return;
124                        }
125                        $duree = $f($page['contexte'][$arg]);
126                        spip_log ("#CACHE $f ($arg={$page['contexte'][$arg]}) renvoie : $duree s", "cachelab");
127
128                        $page['duree'] = $duree;
129                        $page['entetes']['X-Spip-Cache']=$duree;
130
131                        // On garde un souvenir
132                        // unset ($page['entetes']['X-Spip-Methode-Duree-Cache']);
133
134                        // Comme memoization, on ajoute une heure "histoire de pouvoir tourner
135                        // sur le cache quand la base de donnees est plantée (à tester)"
136                        // TODO CORE ? changer creer_cache pour qu'il appelle maj_invalideurs *avant* d'avoir écrit le cache
137                        $Memoization->set($fichier, $page, 3600+$duree);
138                }
139                else 
140                        spip_log ("#CACHE duree cache : la fonction '$f' n'existe pas (arg='$arg')\n".print_r($page,1), "cachelab_erreur");
141        }
142       
143        // Exemple : #CACHE{1200,filtre-bidouille grave} peut grave bidouiller le cache yc ses métadonnées
144        if (isset($page['entetes']['X-Spip-Filtre-Cache'])) {
145                $f = 'cachelab_filtre_'.$page['entetes']['X-Spip-Filtre-Cache'];
146                list ($f, $arg) = split_first_arg($f);
147                if (function_exists($f)) {
148                        spip_log ("#CACHE appelle le filtre $f ($arg)", "cachelab");
149                        $f($page, $arg);
150                        // ici rien de plus, c'est le filtre qui fait ce qu'il veut
151                        // et qui peut enregistrer le résulat
152                }
153                else 
154                        spip_log ("#CACHE filtre : la fonction '$f' n'existe pas (arg='$arg')\n".print_r($page,1), "cachelab_erreur");
155        }
156}
Note: See TracBrowser for help on using the repository browser.