diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php index b35d9438e4f9b31554f3cab0d0e842bca006c99f..0d02f49143404d9491dbef87999c805bbeb3c994 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) {