source: spip-zone/_plugins_/cache_cool/cache_cool_options.php @ 32617

Last change on this file since 32617 was 32617, checked in by cedric@…, 10 years ago

attention fuite de session entre caches :
un cache public calcule en background par un auteur connecte etait suceptible de contenir du contenu concernant cet auteur
on isole la session en la vidant avant le calcul des caches en background, et en restaurant a la fin du calcul pour les autres cron

File size: 4.5 KB
Line 
1<?php
2/*
3 * Plugin Cache Cool
4 * (c) 2009 Cedric
5 * Distribue sous licence GPL
6 *
7 */
8
9/**
10 * Fonction chargee de produire le cache pour un contexte et un fond donne
11 * et de le memoriser si besoin
12 *
13 * S'insere a la place de la fonction du core public_produire_page_dist pour
14 * decider si le cache existant peut etre servi froid, et lancer dans la queue
15 * une tache de mise a jour du cache en cron
16 *
17 * Dans ce cas, on reentre ici avec $use_cache.
18 * On verifie que le contexte produit un $use_cache et un $chemin_cache credibles
19 * (si on est dans l'espace prive au moment du calcul differe, aucun cache ne sera demande)
20 * Il faudrait idealement verifier qu'on retrouve le meme $chemin_cache
21 * mais cela necessiterait d'avoir le $page et le $contexte qui utilises pour cela
22 * dans le cas de la page principal dans public/assembler, mais qui ne sont pas fournis ici
23 *
24 * Si le contexte est semblable, on lance le calcul et la mise a jour du cache,
25 * sinon on reprogramme avec les memes arguments
26 *
27 * @param string $fond
28 * @param array $contexte
29 * @param int $use_cache
30 * @param string $chemin_cache
31 * @param array $contexte_cache
32 * @param array $page
33 * @param int $lastinclude
34 * @param string $connect
35 * @return array
36 */
37function public_produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte_cache, $page, &$lastinclude, $connect=''){
38        static $processing = false;
39        $background = false;
40
41        // calcul differe du cache ?
42        // prend la main si
43        // - c'est un calcul normal avec mise en cache
44        // - un cache existe deja qui peut etre servi
45        // - c'est une visite anonyme (cache mutualise)
46        // - on est pas deja en train de traiter un calcul en background
47        if ($use_cache==1 AND $chemin_cache
48                AND is_array($page) AND count($page)
49                AND !$GLOBALS['visiteur_session']['id_auteur']
50                AND !$processing
51                ) {
52                // on differe la maj du cache et on affiche le contenu du cache ce coup ci encore
53                $where = is_null($contexte_cache)?"principal":"inclure_page";
54                // on reprogramme avec un $use_cache=2 qui permettra de reconnaitre ces calculs
55                job_queue_add('public_produire_page',$c="Calcul du cache $fond [$where]",array($fond, $contexte, 2, $chemin_cache, $contexte_cache, NULL, $lastinclude, $connect),"",TRUE);
56                gunzip_page(&$page); // decomprimer la page si besoin
57                #spip_log($c,'cachedelai');
58                return $page;
59        }
60
61        // si c'est un cacul differe, verifier qu'on est dans le bon contexte
62        if ($use_cache==2){
63                $cacher = charger_fonction('cacher','public');
64                $cacher($contexte_cache, $use_cache, $chemin2, $page, $lastmodified);
65                if (intval($use_cache)!==1 OR !$chemin2){
66                        // on n'est pas dans le bon contexte, il faut se reprogrammer !
67                        $where = is_null($contexte_cache)?"principal":"inclure_page";
68                        $args = func_get_args();
69                        job_queue_add('public_produire_page',$c="[Re] Calcul du cache $fond [$where]",$args,"",TRUE);
70                        #spip_log($c,'cachedelai');
71                        return;
72                }
73                if (!$processing){
74                        $background = true;
75                        // vider la session pour calculer dans le bon contexte
76                        $sessionv = $GLOBALS['visiteur_session'];
77                        $sessiona = $GLOBALS['auteur_session'];
78                        unset($GLOBALS['visiteur_session']);
79                        unset($GLOBALS['auteur_session']);
80                        $processing = true; // indiquer qu'on est deja en differe en cas de reentrance
81                }
82        }
83
84        include_spip('public/assembler');
85        $page = public_produire_page_dist($fond, $contexte, $use_cache, $chemin_cache, $contexte_cache, $page, $lastinclude, $connect);
86
87        if ($background){
88                // baisser le flag processing si c'est nous qui l'avons leve
89                $processing = false;
90                // baisser le flag qui sert a faire remonter une dependance de la session
91                // pour ne pas polluer les calculs suivants eventuels qui n'ont rien a voir
92                unset($GLOBALS['cache_utilise_session']);
93                // restaurer la session
94                $GLOBALS['visiteur_session'] = $sessionv;
95                $GLOBALS['auteur_session'] = $sessiona;
96        }
97        return $page;
98}
99
100$GLOBALS['spip_pipeline']['insert_head'] = str_replace('|f_jQuery','|cache_cool_f_jQuery',$GLOBALS['spip_pipeline']['insert_head']);
101
102// Inserer jQuery sans test de doublon
103// incompatible avec le calcul multiple de squelettes sur un meme hit
104// http://doc.spip.org/@f_jQuery
105function cache_cool_f_jQuery ($texte) {
106        $x = '';
107        foreach (pipeline('jquery_plugins',
108        array(
109                'javascript/jquery.js',
110                'javascript/jquery.form.js',
111                'javascript/ajaxCallback.js'
112        )) as $script)
113                if ($script = find_in_path($script))
114                        $x .= "\n<script src=\"$script\" type=\"text/javascript\"></script>\n";
115        $texte = $x.$texte;
116       
117        return $texte;
118}
119
120$GLOBALS['spip_pipeline']['insert_head'] = str_replace('|f_jQuery','|f_jQuery_cool',$GLOBALS['spip_pipeline']['insert_head']);
121?>
Note: See TracBrowser for help on using the repository browser.