[spip-dev] un find_all_in_path() toxique en cas de mutu

sur un spip 2.0.8 svn en mutualisation (mode domaines différents), après avoir installés 3 ou 4 sites (classiquement) dans /sites, je me retrouve avec la page de config des options avancées (?exec=config_fonctions) qui fait systématiquement un time_out et ce même sans aucun plugins installé...

Quelques trifouillages du fichier /ecrire/exec/config_fonctions.php montrent que c'est l'appel à la fonction configuration_type_urls_dist() du fichier /ecrire/configuration/types_url.php qui fait planter.
Cette fonction fait un appel à un array de fichiers ayant un nom de la forme urlsXXX.php, array construit par la fonction find_all_in_path() lancée (sauvagement!) sur l'ensemble de l'arborescence du site: cf ligne 26:
    foreach (find_all_in_path('', 'urls/\w+\.php$', array()) as $f) {...

Du coup c'est déja lent sur un site non-mutualisé puisque *toute* l'arborescence est scannée (sauf les reps temporaires qui semblent filtrés) mais dans le cas d'une mutualisation le piège referme ses machoires d'acier irrémédiablement: *tous* les sous-répertoires de /sites sont scannés (y compris les /sites/XXX/tmp, /sites/XXX/local, /sites/XXX/tmp/cache...).
Pour peu qu'il y ait quelques sous-sites avec le cache un peu rempli et hop! c'est soit le time-out de php soit le paramètre $maxfiles = 10000; de find_all_in_path() qui est atteint... (sans compter le truc super-louche qu'il serait possible de se retrouver avec des fichiers de définition d'urls qui proviennent du /squelettes ou /plugins d'un autre SPIP que celui en cours!)

La seule soluce à la portée immédiate du pôv webmestre de mutu (sans hacker les fichiers du core donc...) consiste donc à fixer $GLOBALS['type_urls'] dans le mes_options.php du site pour empêcher l'appel de ce find_all_in_path() toxique (cf la première ligne de configuration_type_urls_dist():
if ($GLOBALS['type_urls'] != 'page') return '';

J'imagine bien que ce scannage de la totalité des répertoires est voulu pour permettre la surcharge / l'enrichissement des définitions d'urls mais il y a peut être quelque chose à prévoir pour le cas de la mutualisation?
Vu que c'est le seul endroit de tout le core où cette fonction est appelée sur l'ensemble de l'arborescence plusieurs contournements du problème semblent possibles: modifier cette fonction ou modifier celle qui l'appelle => ça serait quoi la meilleure piste pour un éventuel patch?

Bref, en attendant, si vous avez une mutu, je vous conseille de ne pas oublier le
$GLOBALS['type_urls'] = 'propres|arbo|html|...';
dans le mes_options.php de chacun des sites...

foreach (find_all_in_path('', 'urls/\w+\.php$', array()) as $f) {...
Du coup c'est déja lent sur un site non-mutualisé puisque *toute* l'arborescence est

.../...

J'imagine bien que ce scannage de la totalité des répertoires est voulu pour permettre la surcharge / l'enrichissement des définitions d'urls mais il y a peut être quelque chose à prévoir pour le cas de la mutualisation?

C'est clairement un bug de parcourir toute l'arbo, ce qu'on veut c'est
parcourir tout le chemin, et y trouver les fichiers urls/xxx.php ;
mais là on va dans les sous-répertoires du chemin => bug

Ca n'a rien à voir avec la mutu, en fait. Chez moi sans mutu c'est
très long aussi, et c'est parce que j'ai toute la zone dans plugins/

-- Fil

une fois trouvé, le chemin d’une fonction ne pourrait pas être mémorisé en cache, et recalculé uniquement à chaque modification des plugins ou mise à jour de SPIP ?

.Gilles

2009/6/11 Fil <fil@rezo.net>

Cette fonction fait un appel à un array de fichiers ayant un nom de la forme urlsXXX.php, array construit par la fonction find_all_in_path() lancée (sauvagement!) sur l'ensemble de l'arborescence du site: cf ligne 26:
foreach (find_all_in_path('', 'urls/\w+\.php$', array()) as $f) {...

http://trac.rezo.net/trac/spip/changeset/14100 résoud le problème.

(Au lieu de chercher urls/.*.php partout dans l'arbo, on va chercher
.*.php dans tous les répertoires urls/ de l'arbo)

-- Fil

* Gilles VINCENT tapuscrivait, le 11/06/2009 10:50:

une fois trouvé, le chemin d'une fonction ne pourrait pas être mémorisé en
cache, et recalculé uniquement à chaque modification des plugins ou mise à
jour de SPIP ?

Fil avait fait un test. Et ce dernier n'avait pas été concluant en local (pas de gain/pas de perte non plus).
Par contre, ce test n'avait pas été fait dans le cas d'un Filer déporté...