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

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

gerer les risques de contexte multisites en ne traitant que le cas du site principal

File size: 4.7 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        $is_main_url = (strncmp(url_de_base(),$GLOBALS['meta']['adresse_site'],strlen($GLOBALS['meta']['adresse_site']))==0);
42
43        // calcul differe du cache ?
44        // prend la main si
45        // - c'est un calcul normal avec mise en cache
46        // - un cache existe deja qui peut etre servi
47        // - c'est une visite anonyme (cache mutualise)
48        // - on est pas deja en train de traiter un calcul en background
49        if ($use_cache==1 AND $chemin_cache
50                AND is_array($page) AND count($page)
51                AND !$GLOBALS['visiteur_session']['id_auteur']
52                AND !$processing
53                AND $is_main_url
54                ) {
55                // on differe la maj du cache et on affiche le contenu du cache ce coup ci encore
56                $where = is_null($contexte_cache)?"principal":"inclure_page";
57                // on reprogramme avec un $use_cache=2 qui permettra de reconnaitre ces calculs
58                job_queue_add('public_produire_page',$c="Calcul du cache $fond [$where]",array($fond, $contexte, 2, $chemin_cache, $contexte_cache, NULL, $lastinclude, $connect),"",TRUE);
59                gunzip_page(&$page); // decomprimer la page si besoin
60                #spip_log($c,'cachedelai');
61                return $page;
62        }
63
64        // si c'est un cacul differe, verifier qu'on est dans le bon contexte
65        if ($use_cache==2){
66                $cacher = charger_fonction('cacher','public');
67                $cacher($contexte_cache, $use_cache, $chemin2, $page, $lastmodified);
68                if (intval($use_cache)!==1 OR !$chemin2 OR !$is_main_url){
69                        // on n'est pas dans le bon contexte, il faut se reprogrammer !
70                        $where = is_null($contexte_cache)?"principal":"inclure_page";
71                        $args = func_get_args();
72                        job_queue_add('public_produire_page',$c="[Re] Calcul du cache $fond [$where]",$args,"",TRUE);
73                        #spip_log($c,'cachedelai');
74                        return;
75                }
76                if (!$processing){
77                        $background = true;
78                        // vider la session pour calculer dans le bon contexte
79                        $sessionv = $GLOBALS['visiteur_session'];
80                        $sessiona = $GLOBALS['auteur_session'];
81                        unset($GLOBALS['visiteur_session']);
82                        unset($GLOBALS['auteur_session']);
83                        $processing = true; // indiquer qu'on est deja en differe en cas de reentrance
84                }
85        }
86
87        include_spip('public/assembler');
88        $page = public_produire_page_dist($fond, $contexte, $use_cache, $chemin_cache, $contexte_cache, $page, $lastinclude, $connect);
89
90        if ($background){
91                // baisser le flag processing si c'est nous qui l'avons leve
92                $processing = false;
93                // baisser le flag qui sert a faire remonter une dependance de la session
94                // pour ne pas polluer les calculs suivants eventuels qui n'ont rien a voir
95                unset($GLOBALS['cache_utilise_session']);
96                // restaurer la session
97                $GLOBALS['visiteur_session'] = $sessionv;
98                $GLOBALS['auteur_session'] = $sessiona;
99        }
100        return $page;
101}
102
103$GLOBALS['spip_pipeline']['insert_head'] = str_replace('|f_jQuery','|cache_cool_f_jQuery',$GLOBALS['spip_pipeline']['insert_head']);
104
105// Inserer jQuery sans test de doublon
106// incompatible avec le calcul multiple de squelettes sur un meme hit
107// http://doc.spip.org/@f_jQuery
108function cache_cool_f_jQuery ($texte) {
109        $x = '';
110        foreach (pipeline('jquery_plugins',
111        array(
112                'javascript/jquery.js',
113                'javascript/jquery.form.js',
114                'javascript/ajaxCallback.js'
115        )) as $script)
116                if ($script = find_in_path($script))
117                        $x .= "\n<script src=\"$script\" type=\"text/javascript\"></script>\n";
118        $texte = $x.$texte;
119       
120        return $texte;
121}
122
123$GLOBALS['spip_pipeline']['insert_head'] = str_replace('|f_jQuery','|f_jQuery_cool',$GLOBALS['spip_pipeline']['insert_head']);
124?>
Note: See TracBrowser for help on using the repository browser.