From 9e742668716de0a419a0267a7f665a85ccbf8950 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Sun, 29 Jan 2006 20:45:48 +0000
Subject: [PATCH] Nouvelle interface avec les fonctions du cache, pour pouvoir
 eventuellement decide de la perennite d'un cache sur la base de son contenu

---
 inc-cache.php3         | 36 +++++++++++++++++++++-------
 inc-public-global.php3 | 54 ++++++++++++------------------------------
 2 files changed, 43 insertions(+), 47 deletions(-)

diff --git a/inc-cache.php3 b/inc-cache.php3
index 9774fd98c4..0078eb45e5 100644
--- a/inc-cache.php3
+++ b/inc-cache.php3
@@ -125,16 +125,16 @@ function retire_caches($chemin = '') {
 // > 0 s'il faut calculer la page et le mette en cache pendant N secondes
 //
 
-function cache_valide($chemin_cache) {
+function cache_valide($chemin_cache, $contenu, $date) {
 	global $delais;
 
 	if (!isset($delais)) $delais = 3600;
 
 	if (!$delais) return -1;
 
-	if (!file_exists($chemin_cache)) return $delais;
+	if (!$contenu) return $delais;
 
-	if ((time() - @filemtime($chemin_cache)) > $delais) return $delais;
+	if ((time() - $date) > $delais) return $delais;
 
 	return 0;
 }
@@ -153,7 +153,7 @@ function determiner_cache(&$use_cache, $contexte, $fond) {
 	// cas ignorant le cache car complement dynamique
 	if ($_SERVER['REQUEST_METHOD'] == 'POST') {
 		$use_cache = -1;
-		return "";
+		return array('','',0);
 	}
 	
 	$chemin_cache = generer_nom_fichier_cache($contexte, $fond);
@@ -161,7 +161,7 @@ function determiner_cache(&$use_cache, $contexte, $fond) {
 	// cas sans jamais de calcul pour raison interne
 	if ($_SERVER['REQUEST_METHOD'] == 'HEAD') {
 		$use_cache = 0;
-		return $chemin_cache;
+		return array($chemin_cache, @filemtime($chemin_cache), 0);
 	}
 
 	// Faut-il effacer des pages invalidees (en particulier ce cache-ci) ?
@@ -179,9 +179,12 @@ function determiner_cache(&$use_cache, $contexte, $fond) {
 	    supprimer_fichier($chemin_cache);
 	}
 
-	$use_cache = cache_valide($chemin_cache);
+	$ok = lire_fichier($chemin_cache, $page);
+	$time = @filemtime($chemin_cache);
+	$page = restaurer_meta_donnees ($page);
+	$use_cache = cache_valide($chemin_cache, $page, $time);
 
-	if (!$use_cache) return $chemin_cache;
+	if (!$use_cache AND $ok) return array($chemin_cache, $page, $time);
 
 	// Si pas valide mais pas de connexion a la base, le garder quand meme
 
@@ -195,7 +198,7 @@ function determiner_cache(&$use_cache, $contexte, $fond) {
 		}
 	}
 
-	return ($use_cache < 0) ? "" : $chemin_cache;
+	return array((($use_cache < 0) ? "" : $chemin_cache), $page, $time);
 }
 
 // Passage par reference juste par souci d'economie
@@ -230,6 +233,23 @@ function creer_cache(&$page, $chemin_cache, $duree) {
 	}
 }
 
+function restaurer_meta_donnees ($contenu) {
+
+	if (preg_match("/^<!-- ([^\n]*) -->\n/ms", $contenu, $match)) {
+		$meta_donnees = unserialize($match[1]);
+		if (is_array($meta_donnees)) {
+			foreach ($meta_donnees as $var=>$val) {
+				$page[$var] = $val;
+			}
+		}
+
+	}
+
+	$page['texte'] = substr($contenu, strlen($match[0]));
+	return $page;
+}
+
+
 // purger un petit cache (tidy ou recherche) qui ne doit pas contenir de
 // vieux fichiers
 function nettoyer_petit_cache($prefix, $duree = 300) {
diff --git a/inc-public-global.php3 b/inc-public-global.php3
index 59710dbca2..17a51e08f7 100644
--- a/inc-public-global.php3
+++ b/inc-public-global.php3
@@ -68,38 +68,14 @@ function calcule_header_et_page ($fond) {
 }
 
 
-function obtenir_page_ancienne ($chemin_cache, $fond, $inclusion=false) {
-
-	global $lastmodified ;
-	//
-	// Lire le fichier cache
-	//
-	lire_fichier ($chemin_cache, $page['texte']);
-	$lastmodified = max($lastmodified, @filemtime($chemin_cache));
-	# spip_log ("cache $chemin_cache $lastmodified");
-
-	//
-	// Lire sa carte d'identite & fixer le contexte global
-	//
-	if (preg_match("/^<!-- ([^\n]*) -->\n/ms", $page['texte'], $match)) {
-		$meta_donnees = unserialize($match[1]);
-		if (is_array($meta_donnees)) {
-			foreach ($meta_donnees as $var=>$val) {
-				$page[$var] = $val;
-			}
-		}
-
-		$page['texte'] = substr($page['texte'], strlen($match[0]));
+// Remplir les globals pour les boutons d'admin
 
-		// Remplir les globals pour les boutons d'admin
-		if (!$inclusion AND is_array($page['contexte'])) {
-			foreach ($page['contexte'] as $var=>$val) {
-				$GLOBALS[$var] = $val;
-			}
+function restaurer_globales ($contexte) {
+	if (!is_array($contexte)) {
+		foreach ($contexte as $var=>$val) {
+			$GLOBALS[$var] = $val;
 		}
 	}
-
-	return $page;
 }
 
 function is_preview()
@@ -122,11 +98,10 @@ function afficher_page_globale ($fond) {
 	include_local("inc-cache");
 
 	// Peut-on utiliser un fichier cache ?
-	$chemin_cache = determiner_cache($use_cache, NULL, $fond);
-	if ($chemin_cache)
-		$lastmodified = @filemtime($chemin_cache);
-	else
-		$lastmodified = time();
+	list($chemin_cache, $page, $lastmodified) = 
+		determiner_cache($use_cache, NULL, $fond);
+
+	if (!$chemin_cache) $lastmodified = time();
 
 	// demande de previsualisation ?
 	// -> inc-calcul n'enregistrera pas les fichiers caches
@@ -162,7 +137,7 @@ function afficher_page_globale ($fond) {
 		$page['entetes']["Connection"] = "close";
 	} else {
 		if (!$use_cache)
-			$page = obtenir_page_ancienne ($chemin_cache, $fond, false);
+			restaurer_globales($page['contexte']);
 		else {
 			include_local('inc-calcul');
 			$page = calculer_page_globale ($chemin_cache, $fond);
@@ -239,7 +214,8 @@ function inclure_page($fond, $contexte_inclus, $cache_incluant='') {
 
 	global $lastmodified;
 	// Peut-on utiliser un fichier cache ?
-	$chemin_cache = determiner_cache($use_cache, $contexte_inclus, $fond);
+	list($chemin_cache, $page, $lastinclude) = 
+		determiner_cache($use_cache, $contexte_inclus, $fond);
 
 	// Si on a inclus sans fixer le critere de lang, de deux choses l'une :
 	// - on est dans la langue du site, et pas besoin d'inclure inc_lang
@@ -259,9 +235,9 @@ function inclure_page($fond, $contexte_inclus, $cache_incluant='') {
 		$contexte_inclus['date_redac'] = $contexte_inclus['date'];
 
 	// On va ensuite chercher la page
-	if (!$use_cache)
-		$page =  obtenir_page_ancienne ($chemin_cache, $fond, false);
-	else {
+	if (!$use_cache) {
+		$lastmodified = max($lastmodified, $lastinclude);
+	} else {
 		include_local('inc-calcul');
 		$page = cherche_page($chemin_cache, $contexte_inclus, $fond, false);
 		$lastmodified = time();
-- 
GitLab