From c90af1d19782d0658cf083cbed06b430ff283699 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Fri, 6 Apr 2007 07:30:47 +0000
Subject: [PATCH] "complete et corrige [8991] : il faut que le chargement en
 memoire anticipe d'un bloc qui evite de nombreux find_in_path n'instancie pas
 les fichiers non encore demandes afin de ne pas perturber le mecanisme de
 surcharges par redefinition de fonctions chaque fichier est donc encapsule
 dans une fonction homonyme qui ne sera executee que lorsque l'include avec
 true sera demande "

---
 ecrire/inc/utils.php | 31 ++++++++++++++++++++++++-------
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index b35d9438e4..0d02f49143 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -84,15 +84,30 @@ $GLOBALS['prefetch']['public/composer']['fetch']='calcul_skel';
 $GLOBALS['prefetch']['inc/documents']['fetch']='calcul_skel'; // ne passe pas dans le compacteur a cause des <<<
 
 // inclusion anticipee par bloc pour optimisation des find_in_path
+// chaque fichier inclus est place dans une fonction ad-hoc pour ne pas etre execute
+// avant qu'il ne soit reellement necessaire, et en particulier ne pas bloquer les
+// surcharges par redefinition de fonction (charger_fonction)
+// on inclue un numero de version de format du prefetch dans le nom du fichier
+// ce qui permet les upgrades sans soucis
+define('_PREFETCH_PREFIXE_FICHIERS','prefetch-v01-noyau-');
 function include_prefetch($f){
 	static $encours=false;
-	if (($fetch=$GLOBALS['prefetch'][$f]['fetch'])==false) return false; // le chargement anticipe est deja fait, ne plus rien inclure
+	if ($GLOBALS['prefetch'][$f]['fetch']==false) return false;// fichier charge et execute
+	if (($fun=$GLOBALS['prefetch'][$f]['fonction'])){// fichier deja en memoire mais pas encore execute
+		$fun(); // simule l'inclusion du code precedemment charge
+		return false; // le chargement anticipe est deja fait, ne plus rien inclure
+	}
 	if ($encours) return true;// la construction du chargeur est en cours, inclure normalement pour ne pas boucler
-	if (@is_readable(($nom_fetch = _DIR_TMP."prefetch-noyau-$fetch.php"))){
+	$fetch=$GLOBALS['prefetch'][$f]['fetch'];
+	if (@is_readable(($nom_fetch = _DIR_TMP._PREFETCH_PREFIXE_FICHIERS."$fetch.php"))){
 		include_once($nom_fetch);
-		return $GLOBALS['prefetch'][$f]['fetch']; // false si le fichier est bien dans le prefetch
+		if (($fun=$GLOBALS['prefetch'][$f]['fonction'])){
+			$fun(); // simule l'inclusion du code precedemment charge
+			return false; // le chargement anticipe est deja fait, ne plus rien inclure
+		}
+		return true; // le fichier n'est pas dans le prefetch, il faut l'inclure unitairement
 	}
-	$encours = true; // ne plus fetcher ce hit la
+	$encours = true; // ne plus fetcher lors de ce hit la, on construit
 	$prologue = "";
 	$source = "";
 	foreach($GLOBALS['prefetch'] as $fichier=>$pre)
@@ -100,8 +115,10 @@ function include_prefetch($f){
 			$s = include_spip($fichier,false);
 			lire_fichier($s,$contenu);
 			if (strlen($contenu)){
+				$fun = 'prefetch_'.str_replace("/","_",$fichier);
 				$prologue .= "\$GLOBALS['prefetch']['$fichier']['fichier']='$s';\n";
-				$prologue .= "\$GLOBALS['prefetch']['$fichier']['fetch']=false;\n";
+				$prologue .= "\$GLOBALS['prefetch']['$fichier']['fonction']='$fun';\n";
+				$contenu = "<"."?php\nfunction $fun(){\n\$GLOBALS['prefetch']['$fichier']['fetch']=false; ?".">" . $contenu . "<"."?php } ?".">";
 				$source .= $contenu;
 			}
 		}
@@ -118,8 +135,8 @@ function include_prefetch($f){
 function include_spip($f, $include = true) {
 	$s = "";
 	if (isset($GLOBALS['prefetch'][$f])){
-		$include = ($include AND include_prefetch($f));
-		if (isset($GLOBALS['prefetch'][$f]['fichier']))
+		$include = ($include AND include_prefetch($f)); // si include est deja false, on ne prefetch pas
+		if (isset($GLOBALS['prefetch'][$f]['fichier'])) // mais si on sait ou est le fichier, on repond
 			$s = $GLOBALS['prefetch'][$f]['fichier'];
 	}
 	if(!$s) {
-- 
GitLab