From 2457549ecb47f2e54ba59460d55af039b5e1b6e5 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Mon, 25 Jun 2007 08:14:12 +0000
Subject: [PATCH] suppression du noyau, du prefetch etc pour remplacer par une
 methode rapide de gestion du find_in_path()

---
 ecrire/inc/meta.php   |   4 --
 ecrire/inc/plugin.php |   2 -
 ecrire/inc/utils.php  | 124 +++++++++---------------------------------
 3 files changed, 27 insertions(+), 103 deletions(-)

diff --git a/ecrire/inc/meta.php b/ecrire/inc/meta.php
index 2943fb2624..ca3749e3ac 100644
--- a/ecrire/inc/meta.php
+++ b/ecrire/inc/meta.php
@@ -56,10 +56,6 @@ function ecrire_metas() {
 	lire_metas();
 
 	if (is_array($GLOBALS['meta'])) {
-
-		if (_DIR_RESTREINT && is_array($GLOBALS['noyau']))
-			$GLOBALS['meta']['noyau'] = $GLOBALS['noyau'];
-
 		$ok = ecrire_fichier (_FILE_META, serialize($GLOBALS['meta']));
 		if (!$ok && $GLOBALS['connect_statut'] == '0minirezo') {
 			include_spip('inc/headers');
diff --git a/ecrire/inc/plugin.php b/ecrire/inc/plugin.php
index 1070b54b35..e252c100df 100644
--- a/ecrire/inc/plugin.php
+++ b/ecrire/inc/plugin.php
@@ -170,8 +170,6 @@ function ecrire_plugin_actifs($plugin,$pipe_recherche=false,$operation='raz'){
 	
 	// recharcher le xml des plugins a activer
 	$plugin_valides = liste_plugin_valides($plugin,$infos,true);
-	// invalider les fichiers precompiles du noyau
-	invalide_prefetch();
 	
 	ecrire_meta('plugin',serialize($plugin_valides));
 	$plugin_header_info = array();
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index 5f58b911f1..da5a53033b 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -58,89 +58,15 @@ function charger_fonction($nom, $dossier='exec', $continue=false) {
 	exit;
 }
 
-// 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
-// http://doc.spip.org/@include_prefetch
-function include_prefetch($f){
-	static $encours=false;
-	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
-	$fetch=$GLOBALS['prefetch'][$f]['fetch'];
-	if (@is_readable(($nom_fetch = _DIR_TMP._PREFETCH_PREFIXE_FICHIERS."$fetch.php"))){
-		include_once($nom_fetch);
-		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 lors de ce hit la, on construit
-	$prologue = "";
-	$source = "";
-	include_spip('inc/filtres');
-	foreach($GLOBALS['prefetch'] as $fichier=>$pre)
-		if ($pre['fetch']==$fetch){
-			$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']['fonction']='$fun';\n";
-				$contenu = "<"."?php\nfunction $fun(){\n\$GLOBALS['prefetch']['$fichier']['fetch']=false; ?".">" 
-				  . compacte_php($contenu) . "<"."?php } ?".">";
-				$source .= $contenu;
-			}
-		}
-
-	$source = "<"."?php\n$prologue?".">".$source;
-	$source = preg_replace(',\?'.'>\s*<'.'\?php,ms','',$source); // remplacer les successions fermeture/ouverture des balises php
-	spip_log('ecrire prefetch: '.$nom_fetch.', '.strlen($source).'b');
-	ecrire_fichier($nom_fetch,$source); #compacte_php($source) si on a un compacteur qui marche ...
-	return true;
-}
-// invalidation des fichiers de prechargement
-// http://doc.spip.org/@invalide_prefetch
-function invalide_prefetch(){
-	$fetches = preg_files(_DIR_TMP,_PREFETCH_PREFIXE_FICHIERS.".*[.]php$",10,false);
-	foreach($fetches as $f) @unlink($f);
-}
 
 //
 // une fonction cherchant un fichier dans une liste de repertoires
 //
 // http://doc.spip.org/@include_spip
 function include_spip($f, $include = true) {
-	$s = "";
-	/*
-	if (isset($GLOBALS['prefetch'][$f]) AND !defined('_PAS_DE_PRECHARGEMENT_PHP')){
-
-		$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) {
-		// Dans le noyau ?
-		if (isset($GLOBALS['noyau'][$f])) {
-			$s = $GLOBALS['noyau'][$f];
-		}
-		// Sinon le chercher et mettre a jour le noyau
-		else {
-			if (!$s = find_in_path($f . '.php')
-			AND (!_EXTENSION_PHP OR !$s = find_in_path($f . '.php3'))) {
-				return $GLOBALS['noyau'][$f] = false;
-			} else
-				$GLOBALS['noyau'][$f] = $s;
-		}
-	}
+	if (!$s = find_in_path($f . '.php')
+		AND (!_EXTENSION_PHP OR !$s = find_in_path($f . '.php3')))
+			return false;
 
 	// On charge le fichier (sauf si on ne voulait que son chemin)
 	if ($include && $s) {
@@ -751,18 +677,31 @@ function creer_chemin() {
 	return $path_a;
 }
 
-// http://doc.spip.org/@find_in_path
-function find_in_path ($filename) {
-	// Parcourir le chemin
-	foreach (creer_chemin() as $dir) {
-		if (@is_readable($f = "$dir$filename")) {
-# spip_log("find_in_path trouve $f");
-			return $f;
+// Cette fonction est appelee une seule fois par hit et par dir du chemin
+function memoriser_fichiers($dir) {
+	$fichiers = array();
+	if (is_dir($dir)
+	AND $t = @opendir($dir)) {
+		while (($f = readdir($t)) !== false) {
+			$fichiers[$f] = true;
 		}
 	}
+	return $fichiers;
+}
 
-# spip_log("find_in_path n'a pas vu '$filename' dans " . join(':',creer_chemin()));
-	return false;
+// http://doc.spip.org/@find_in_path
+function find_in_path ($filename) {
+	static $ram;
+	$dirs = creer_chemin();
+
+	$p = pathinfo($filename);
+	foreach($dirs as $dir) {
+		$sous = $dir.$p['dirname'];
+		if (!isset($ram[$sous]))
+			$ram[$sous] = memoriser_fichiers($sous);
+		if ($ram[$sous][$p['basename']])
+			return $sous.'/'.$p['basename'];
+	}
 }
 
 
@@ -1273,18 +1212,9 @@ function spip_initialisation($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) {
 	// Duree de validite de l'alea pour les cookies et ce qui s'ensuit.
 	define('_RENOUVELLE_ALEA', 12 * 3600);
 
-	// Lire les meta cachees et init noyau (espace public uniquement)
-	$GLOBALS['noyau'] = array();
-	if (lire_fichier(_FILE_META, $meta)) {
+	// Lire les meta cachees
+	if (lire_fichier(_FILE_META, $meta))
 		$GLOBALS['meta'] = @unserialize($meta);
-		if (_DIR_RESTREINT
-		AND !isset($_REQUEST['var_mode'])
-		AND isset($GLOBALS['meta']['noyau'])
-		AND is_array($GLOBALS['meta']['noyau'])) {
-			$GLOBALS['noyau'] = $GLOBALS['meta']['noyau'];
-			unset ($GLOBALS['meta']['noyau']);
-		}
-	}
 
 	if  (_FILE_CONNECT) {
 	// en cas d'echec refaire le fichier
-- 
GitLab