From 04005bd16b914cebfd3f53d642f6b26ec816b4d0 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Sat, 16 Sep 2006 07:51:25 +0000
Subject: [PATCH] meilleure unification de  et #CACHE{}, corrige un bug sur les
 inclure qui passaient en delais 1 en l'absence de #CACHE

---
 ecrire/public/assembler.php  | 18 +++++----
 ecrire/public/cacher.php     | 74 ++++++++++++++++--------------------
 ecrire/public/parametrer.php | 20 ++++++++--
 3 files changed, 59 insertions(+), 53 deletions(-)

diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php
index 153c12308e..b585863fb7 100644
--- a/ecrire/public/assembler.php
+++ b/ecrire/public/assembler.php
@@ -206,7 +206,8 @@ function inclure_page($fond, $contexte_inclus) {
 	}
 
 	$fcache = charger_fonction('cacher', 'public');
-	// Garnir ces quatre parametres avec les infos sur le cache
+	// Garnir ces quatre parametres avec les infos sur le cache :
+	// emplacement, validite, et, s'il est valide, contenu & age
 	$fcache($contexte_inclus, $use_cache, $chemin_cache, $page, $lastinclude);
 
 	// Une fois le chemin-cache decide, on ajoute la date (et date_redac)
@@ -216,21 +217,24 @@ function inclure_page($fond, $contexte_inclus) {
 	if (!isset($contexte_inclus['date_redac']))
 		$contexte_inclus['date_redac'] = $contexte_inclus['date'];
 
-	// On va ensuite chercher la page
+	// Si use_cache vaut 0, la page a ete tiree du cache et se trouve dans $page
 	if (!$use_cache) {
 		$lastmodified = max($lastmodified, $lastinclude);
-	} else {
+	}
+	// sinon on la calcule
+	else {
 		$f = charger_fonction('parametrer', 'public');
 		$page = $f($fond, $contexte_inclus, $chemin_cache);
 		$lastmodified = time();
-		if ($chemin_cache)
-			$fcache($contexte_inclus, $use_cache, $chemin_cache, $page, $lastmodified);
+		// et on l'enregistre sur le disque
+		if ($chemin_cache
+		AND $page['entetes']['X-Spip-Cache'] > 0)
+			$fcache($contexte_inclus, $use_cache, $chemin_cache, $page,
+				$lastmodified);
 	}
 	if($lang_select)
 		lang_dselect();
 
-#print_r($contexte_inclus);print_r($page);exit;
-
 	return $page;
 }
 
diff --git a/ecrire/public/cacher.php b/ecrire/public/cacher.php
index 3a22e08460..52e4deba9a 100644
--- a/ecrire/public/cacher.php
+++ b/ecrire/public/cacher.php
@@ -140,21 +140,9 @@ function retire_caches($chemin = '') {
 
 // http://doc.spip.org/@cache_valide
 function cache_valide($chemin_cache, $date) {
-
-	if (!isset($GLOBALS['delais']))
-		$GLOBALS['delais'] = 3600;
-
-	if (
-		isset($_REQUEST['delais'])
-		AND $GLOBALS['delais'] == $_REQUEST['delais']
-	)
-		die ("tester_variable: 'delais' interdite");
-
-	if (!$GLOBALS['delais']) return -1;
-
-	if ((time() - $date) > $GLOBALS['delais']) return $GLOBALS['delais'];
-
-	return 0;
+	if (!$GLOBALS['delais']) return -1; // delais=0, calcul a faire
+	if ((time() - $date) > $GLOBALS['delais']) return 1; // cache trop vieux
+	return 0; // cache ok
 }
 
 // gestion des delais par specification a l'interieur du squelette
@@ -175,7 +163,7 @@ function cache_valide_autodetermine($chemin_cache, $page, $date) {
 		if ($duree == 0)  #CACHE{0}
 			return -1;
 		else if ($date + $duree < time())
-			return $duree;
+			return 1;
 		else
 			return 0;
 	}
@@ -188,14 +176,7 @@ function cache_valide_autodetermine($chemin_cache, $page, $date) {
 // Creer le fichier cache
 # Passage par reference de $page par souci d'economie
 // http://doc.spip.org/@creer_cache
-function creer_cache(&$page, &$chemin_cache, $duree) {
-	// Entrer dans la base les invalideurs calcules par le compilateur
-	// (et supprimer les anciens)
-
-	// arbitrage entre ancien et nouveau modele de delai:
-	// primaute a la duree de vie de la page donnee a l'interieur de la page 
-	if (isset($page['entetes']['X-Spip-Cache']))
-		$duree = intval($page['entetes']['X-Spip-Cache']);
+function creer_cache(&$page, &$chemin_cache) {
 
 	// Enregistrer le fichier cache qui contient
 	// 1) la carte d'identite de la page (ses "globals", genre id_article=7)
@@ -210,16 +191,18 @@ function creer_cache(&$page, &$chemin_cache, $duree) {
 
 	// l'enregistrer, compresse ou non...
 	$chemin_cache .= $gz;
-	ecrire_fichier(_DIR_CACHE . $chemin_cache,
+	$ok = ecrire_fichier(_DIR_CACHE . $chemin_cache,
 		"<!-- "
 		. str_replace("\n", " ", serialize($page['signal']))
 		. " -->\n"
 		. $page['texte']);
 
-	spip_log("Creation du cache $chemin_cache pour $duree secondes");
+	spip_log("Creation du cache $chemin_cache pour "
+		. $page['entetes']['X-Spip-Cache']." secondes". ($ok?'':' (erreur!)'));
+
 	// Inserer ses invalideurs
 	include_spip('inc/invalideur');
-	maj_invalideurs($chemin_cache, $page, $duree);
+	maj_invalideurs($chemin_cache, $page, $page['entetes']['X-Spip-Cache']);
 
 	// En profiter pour verifier que le .htaccess (deny all) est bien la
 	include_spip('inc/acces');
@@ -263,10 +246,10 @@ function nettoyer_petit_cache($prefix, $duree = 300) {
 // Si son 3e argument est non vide, elle passe la main a creer_cache
 // Sinon, elle recoit un contexte (ou le construit a partir de REQUEST_URI)
 // et affecte les 4 autres parametres recus par reference:
-// - use_cache qui est
-//     < 0 s'il faut calculer la page sans la mettre en cache
-//     = 0 si on peut utiliser un cache existant
-//     > 0 s'il faut calculer la page et la mette en cache use_cache secondes
+// - use_cache qui vaut
+//     -1 s'il faut calculer la page sans la mettre en cache
+//      0 si on peut utiliser un cache existant
+//      1 s'il faut calculer la page et la mettre en cache
 // - chemin_cache qui est le chemin d'acces au fichier ou vide si pas cachable
 // - page qui est le tableau decrivant la page, si le cache la contenait
 // - lastmodified qui vaut la date de derniere modif du fichier.
@@ -274,9 +257,12 @@ function nettoyer_petit_cache($prefix, $duree = 300) {
 // http://doc.spip.org/@public_cacher_dist
 function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$lastmodified) {
 
-	if ($chemin_cache) return creer_cache($page, $chemin_cache, $use_cache);
+	// Second appel, destine a l'enregistrement du cache sur le disque
+	if ($chemin_cache) return creer_cache($page, $chemin_cache);
+
+	// Toute la suite correspond au premier appel
 
-	// cas ignorant le cache car complement dynamique
+	// Cas ignorant le cache car complement dynamique
 	if ($_SERVER['REQUEST_METHOD'] == 'POST'
 	OR substr($contexte['fond'],0,8)=='modeles/') {
 		$use_cache = -1;
@@ -301,7 +287,7 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la
 
 	// Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
 	if (isset($GLOBALS['meta']['invalider'])) {
-		// le faire si la base est disponible
+		// ne le faire que si la base est disponible
 		if (spip_connect()) {
 			include_spip('inc/meta');
 			lire_metas();
@@ -309,7 +295,7 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la
 		}
 	}
 
-	// cas sans jamais de cache pour raison interne
+	// Cas sans jamais de cache pour raison interne
 	if (isset($GLOBALS['var_mode']) &&
 		(isset($_COOKIE['spip_session'])
 		|| isset($_COOKIE['spip_admin'])
@@ -317,20 +303,23 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la
 			supprimer_fichier(_DIR_CACHE . $chemin_cache);
 	}
 
-	if ($ok = lire_fichier(_DIR_CACHE . $chemin_cache, $page)) {
+	// $delais par defaut (pour toutes les pages sans #CACHE{})
+	if (!isset($GLOBALS['delais'])) $GLOBALS['delais'] = 3600;
+
+	// Lire le fichier cache et determiner sa validite
+	if (lire_fichier(_DIR_CACHE . $chemin_cache, $page)) {
 		$lastmodified = @file_exists(_DIR_CACHE . $chemin_cache) ?
 			@filemtime(_DIR_CACHE . $chemin_cache) : 0;
 		$page = restaurer_meta_donnees ($page);
 		$use_cache = cache_valide_autodetermine($chemin_cache, $page, $lastmodified);
-		if (!$use_cache) return;
-	} else {
-		$use_cache = 1;
-	}
+		if (!$use_cache) return; // cache utilisable
+	} else
+		$use_cache = 1; // fichier cache absent : provoque le calcul
 
 	// Si pas valide mais pas de connexion a la base, le garder quand meme
 	if (!spip_connect()) {
 		if (file_exists(_DIR_CACHE . $chemin_cache))
-			$use_cache = 0 ;
+			$use_cache = 0;
 		else {
 			spip_log("Erreur base de donnees, impossible utiliser $chemin_cache");
 			include_spip('inc/minipres');
@@ -338,7 +327,8 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la
 		}
 	}
 
-	if ($use_cache < 0) $chemin_cache = "";
+	if ($use_cache < 0) $chemin_cache = '';
 	return;
 }
+
 ?>
diff --git a/ecrire/public/parametrer.php b/ecrire/public/parametrer.php
index d9a78950f1..c4c2ef5d69 100644
--- a/ecrire/public/parametrer.php
+++ b/ecrire/public/parametrer.php
@@ -319,14 +319,25 @@ function public_parametrer_dist($fond, $local='', $cache='')  {
 	$f = charger_fonction('composer', 'public');
 
 	if ($fonc = $f($skel, $mime_type, $gram, $sourcefile)){
-		spip_timer('calcul page');
+		spip_timer($a = 'calcul page '.rand(0,1000));
 		$page = $fonc(array('cache' => $cache), array($local));
+
+		// spip_log: un joli contexte
+		$info = array();
+		foreach($local as $var => $val)
+			if($val)
+				$info[] = "$var='$val'";
 		spip_log("calcul ("
-			.spip_timer('calcul page')
-			.") [$skel] ".
-			 join(", ", $local)
+			.spip_timer($a)
+			.") [$skel] "
+			. join(', ',$info)
 			.' ('.strlen($page['texte']).' octets)'
 		);
+
+		// Si #CACHE{} n'etait pas la, le mettre a $delais
+		if (!isset($page['entetes']['X-Spip-Cache']))
+			$page['entetes']['X-Spip-Cache'] = $GLOBALS['delais'];
+
 	} else
 		$page = array();
 
@@ -337,4 +348,5 @@ function public_parametrer_dist($fond, $local='', $cache='')  {
 	$page['signal'] = signaler_squelette($local);
 	return $page;
 }
+
 ?>
-- 
GitLab