diff --git a/ecrire/action/purger.php b/ecrire/action/purger.php index 1dd09d2762f654b10972f582e02aa816052f8aa2..6ff2b95ff17c333d997193eaaa00ccb255488a29 100644 --- a/ecrire/action/purger.php +++ b/ecrire/action/purger.php @@ -31,6 +31,7 @@ function action_purger_dist() @spip_unlink(_CACHE_PLUGINS_OPT); @spip_unlink(_CACHE_PLUGINS_FCT); @spip_unlink(_CACHE_PLUGINS_VERIF); + @spip_unlink(_CACHE_CHEMIN); purger_repertoire(_DIR_CACHE); purger_repertoire(_DIR_AIDE); purger_repertoire(_DIR_VAR.'cache-css'); diff --git a/ecrire/inc/plugin.php b/ecrire/inc/plugin.php index 8618126c68a4670f2ef6a55016cbed1e9cae4328..e262dbb5cf2daef233ef3ba9c0e59c7fb7337a5a 100644 --- a/ecrire/inc/plugin.php +++ b/ecrire/inc/plugin.php @@ -449,6 +449,7 @@ function ecrire_plugin_actifs($plugin,$pipe_recherche=false,$operation='raz') { } ecrire_fichier(_CACHE_PLUGINS_VERIF, serialize($liste_fichier_verif)); + @spip_unlink(_CACHE_CHEMIN); } // precompilation des pipelines diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php index 15f9bbfb3d33e2416c0e442137c2014266f99a93..7a7d7f2ce3f4c0aac76fef25018214f2dcc10fc2 100644 --- a/ecrire/inc/utils.php +++ b/ecrire/inc/utils.php @@ -695,17 +695,20 @@ function chemin_image($icone){ // si on donne un sous-repertoire en 2e arg optionnel, il FAUT le / final // si 3e arg vrai, on inclut si ce n'est fait. define('_ROOT_CWD', getcwd().'/'); +$GLOBALS['path_files'] = null; // http://doc.spip.org/@find_in_path function find_in_path ($file, $dirname='', $include=false) { - static $files=array(), $dirs=array(); + static $dirs=array(); static $inc = array(); # cf http://trac.rezo.net/trac/spip/changeset/14743 - if (isset($files[$dirname][$file])) { + if (isset($GLOBALS['path_files'][$dirname][$file])) { + if (!$GLOBALS['path_files'][$dirname][$file]) + return false; if ($include AND !isset($inc[$dirname][$file])) { - include_once _ROOT_CWD . $files[$dirname][$file]; + include_once _ROOT_CWD . $GLOBALS['path_files'][$dirname][$file]; $inc[$dirname][$file] = $inc[''][$dirname . $file] = true; } - return $files[$dirname][$file]; + return $GLOBALS['path_files'][$dirname][$file]; } $a = strrpos($file,'/'); @@ -723,7 +726,9 @@ function find_in_path ($file, $dirname='', $include=false) { include_once _ROOT_CWD . $a; $inc[$dirname][$file] = $inc[''][$dirname . $file] = true; } - return $files[$dirname][$file] = $files[''][$dirname . $file] = $a; + if (!defined('_SAUVER_CHEMIN')) + define('_SAUVER_CHEMIN',true); + return $GLOBALS['path_files'][$dirname][$file] = $GLOBALS['path_files'][''][$dirname . $file] = $a; } } } @@ -739,8 +744,35 @@ function find_in_path ($file, $dirname='', $include=false) { die("Erreur interne: ne peut inclure $dirname$file"); } } + + if (!defined('_SAUVER_CHEMIN')) + define('_SAUVER_CHEMIN',true); + return $GLOBALS['path_files'][$dirname][$file] = $GLOBALS['path_files'][''][$dirname . $file] = false; +} + +function load_path_cache(){ + $GLOBALS['path_files'] = array(); + // si le visiteur est admin, + // on ne recharge pas le cache pour forcer sa mise a jour + // le cache de chemin n'est utilise que dans le public + if (_DIR_RESTREINT + AND (!isset($GLOBALS['visiteur_statut']) OR $GLOBALS['visiteur_statut']!='0minirezo')){ + lire_fichier(_CACHE_CHEMIN,$contenu); + if (!$GLOBALS['path_files']=unserialize($contenu)) + $GLOBALS['path_files'] = array(); + } + // pas de sauvegarde du chemin si on est pas dans le public + if (!_DIR_RESTREINT) + define('_SAUVER_CHEMIN',false); +} + +function save_path_cache(){ + if (defined('_SAUVER_CHEMIN') + AND _SAUVER_CHEMIN) + ecrire_fichier(_CACHE_CHEMIN,serialize($GLOBALS['path_files'])); } + /** * Trouve tous les fichiers du path correspondants a un pattern * pour un nom de fichier donne, ne retourne que le premier qui sera trouve @@ -1135,6 +1167,7 @@ function spip_initialisation_core($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) { define('_CACHE_PLUGINS_FCT', _DIR_CACHE . "charger_plugins_fonctions.php"); define('_CACHE_PLUGINS_VERIF', _DIR_CACHE . "verifier_plugins.txt"); define('_CACHE_PIPELINES', _DIR_CACHE."charger_pipelines.php"); + define('_CACHE_CHEMIN', _DIR_CACHE."chemin.txt"); # attention .php obligatoire pour ecrire_fichier_securise define('_FILE_META', $ti . 'meta_cache.php'); @@ -1197,6 +1230,9 @@ function spip_initialisation_core($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) { // systematique du noyau ou une baisse de perfs => a etudier) include_once _DIR_RESTREINT . 'inc/flock.php'; + // charger tout de suite le cache path + load_path_cache(); + // *********** traiter les variables ************ // diff --git a/ecrire/public.php b/ecrire/public.php index b569afcbcd7be7b244e0db25c2782ea6c5f0cbac..5f4fd50ba699bcf45e03cc7bb1011a8edf44bd1d 100644 --- a/ecrire/public.php +++ b/ecrire/public.php @@ -225,17 +225,20 @@ if (isset($GLOBALS['_INC_PUBLIC'])) { calculer_prochain_postdate(true); } - // Effectuer une tache de fond ? - // si #SPIP_CRON est present, on ne le tente que pour les navigateurs - // en mode texte (par exemple), et seulement sur les pages web - if (defined('_DIRECT_CRON_FORCE') - OR ( - !defined('_DIRECT_CRON_INHIBE') - AND $html - AND !strstr($page['texte'], '<!-- SPIP-CRON -->') - AND !preg_match(',msie|mozilla|opera|konqueror,i', $_SERVER['HTTP_USER_AGENT'])) - ) - cron(); + // Effectuer une tache de fond ? + // si #SPIP_CRON est present, on ne le tente que pour les navigateurs + // en mode texte (par exemple), et seulement sur les pages web + if (defined('_DIRECT_CRON_FORCE') + OR ( + !defined('_DIRECT_CRON_INHIBE') + AND $html + AND !strstr($page['texte'], '<!-- SPIP-CRON -->') + AND !preg_match(',msie|mozilla|opera|konqueror,i', $_SERVER['HTTP_USER_AGENT'])) + ) + cron(); + + // sauver le cache chemin si necessaire + save_path_cache(); } }