From 62a4a9a59ddbe3bbecb2d7d326ecaf281d7de947 Mon Sep 17 00:00:00 2001 From: Fil <fil@rezo.net> Date: Thu, 24 Jan 2008 22:46:27 +0000 Subject: [PATCH] pouvoir dire qu'un squelette ne doit pas etre invalide des qu'on touche a la base de donnees (sur une idee et une piste de code donnees par Renaud, ml@ascii-fr.com) : #CACHE{3600, statique} --- ecrire/public.php | 6 +++--- ecrire/public/assembler.php | 8 ++++++++ ecrire/public/balises.php | 24 +++++++++++++++++++----- ecrire/public/cacher.php | 32 +++++++++++++++++++------------- 4 files changed, 49 insertions(+), 21 deletions(-) diff --git a/ecrire/public.php b/ecrire/public.php index 38bf96424d..1b01330786 100644 --- a/ecrire/public.php +++ b/ecrire/public.php @@ -178,7 +178,7 @@ if ($GLOBALS['_INC_PUBLIC']>0) { // 1. Cas d'une page contenant uniquement du HTML : if ($page['process_ins'] == 'html') { - foreach($page['entetes'] as $k => $v) @header("$k: $v"); + envoyer_entetes($page['entetes']); } // 2. Cas d'une page contenant du PHP : @@ -189,7 +189,7 @@ if ($GLOBALS['_INC_PUBLIC']>0) { // Si la retention du flux de sortie est impossible // envoi des entetes if (!$flag_ob) { - foreach($page['entetes'] as $k => $v) @header("$k: $v"); + envoyer_entetes($page['entetes']); xml_hack($page, true); eval('?' . '>' . $page['texte']); $page['texte'] = ''; @@ -206,7 +206,7 @@ if ($GLOBALS['_INC_PUBLIC']>0) { xml_hack($page); ob_end_clean(); - foreach($page['entetes'] as $k => $v) @header("$k: $v"); + envoyer_entetes($page['entetes']); // en cas d'erreur lors du eval, // la memoriser dans le tableau des erreurs // On ne revient pas ici si le nb d'erreurs > 4 diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php index 648ce45dc9..1447327e11 100644 --- a/ecrire/public/assembler.php +++ b/ecrire/public/assembler.php @@ -110,6 +110,14 @@ function public_assembler_dist($fond, $connect='') { return assembler_page ($fond, $connect); } +// Envoyer les entetes, en retenant ceux qui sont a usage interne +// et demarrent par X-Spip-... +function envoyer_entetes($entetes) { + foreach ($entetes as $k => $v) + # if (strncmp($k, 'X-Spip-', 7)) + @header("$k: $v"); +} + // // calcule la page et les entetes diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php index 97b6fbe4cf..4fde6d5150 100644 --- a/ecrire/public/balises.php +++ b/ecrire/public/balises.php @@ -947,6 +947,10 @@ function balise_HTTP_HEADER_dist($p) { // #CACHE{24*3600} // parametre(s) supplementaire(s) : // #CACHE{24*3600, cache-client} autorise gestion du IF_MODIFIED_SINCE +// #CACHE{24*3600, statique} ne respecte pas l'invalidation par modif de la base +// (mais s'invalide tout de meme a l'expiration du delai) +// par defaut cache-client => statique +// cf. ecrire/public/cacher.php // http://doc.spip.org/@balise_CACHE_dist function balise_CACHE_dist($p) { $duree = valeur_numerique($p->param[0][1][0]->texte); @@ -965,14 +969,24 @@ function balise_CACHE_dist($p) { .'?php header("Pragma: no-cache"); ?' .'>\''; - // cas #CACHE{360, cache-client} - if (isset($p->param[0][2])) { - $second = ($p->param[0][2][0]->texte); - if ($second == 'cache-client' - AND $duree > 0) + // recuperer les parametres suivants + $i = 1; + while (isset($p->param[0][++$i])) { + $pa = ($p->param[0][$i][0]->texte); + + if ($pa == 'cache-client' + AND $duree > 0) { $p->code .= '.\'<'.'?php header("Cache-Control: max-age=' . $duree . '"); ?'.'>\''; + // il semble logique, si on cache-client, de ne pas invalider + $pa = 'statique'; + } + + if ($pa == 'statique' + AND $duree > 0) + $p->code .= '.\'<'.'?php header("X-Spip-Statique: oui"); ?'.'>\''; + } $p->interdire_scripts = false; diff --git a/ecrire/public/cacher.php b/ecrire/public/cacher.php index 364a66ad3b..d41d0f3c79 100644 --- a/ecrire/public/cacher.php +++ b/ecrire/public/cacher.php @@ -95,20 +95,26 @@ function cache_valide(&$page, $date) { if (!$page) return 1; - // Cache invalide par la meta 'derniere_modif' - if ($GLOBALS['derniere_modif_invalide'] - AND $date < $GLOBALS['meta']['derniere_modif']) - return 1; + // #CACHE{n,statique} => on n'invalide pas avec derniere_modif + // cf. ecrire/public/balises.php, balise_CACHE_dist() + if ($page['entetes']['X-Spip-Statique'] !== 'oui') { + + // Cache invalide par la meta 'derniere_modif' + if ($GLOBALS['derniere_modif_invalide'] + AND $date < $GLOBALS['meta']['derniere_modif']) + return 1; + + // Apparition d'un nouvel article post-date ? + if ($GLOBALS['meta']['post_dates'] == 'non' + AND isset($GLOBALS['meta']['date_prochain_postdate']) + AND time() > $GLOBALS['meta']['date_prochain_postdate']) { + spip_log('Un article post-date invalide le cache'); + include_spip('inc/rubriques'); + ecrire_meta('derniere_modif', time()); + calculer_prochain_postdate(); + return 1; + } - // Apparition d'un nouvel article post-date ? - if ($GLOBALS['meta']['post_dates'] == 'non' - AND isset($GLOBALS['meta']['date_prochain_postdate']) - AND time() > $GLOBALS['meta']['date_prochain_postdate']) { - spip_log('Un article post-date invalide le cache'); - include_spip('inc/rubriques'); - ecrire_meta('derniere_modif', time()); - calculer_prochain_postdate(); - return 1; } // Sinon comparer l'age du fichier a sa duree de cache -- GitLab