Re: Première version
Eric Daspet <[email protected]> Tue, 30 Mar 2004 18:08:18 +0200
| Newsgroups | gmane.comp.web.blogv2.devel |
|---|---|
| Message-ID | <[email protected]> |
Olivier Pascal wrote: > Je n'ai pas trop bien compris le but de ta procédure en fait. Bon, alors je reprend en plus clair. J'ai deux problèmes de tri : 1/ Quand j'ai plusieurs modules, certains peuvent vouloir remplacer une fonctionnalité existante pour la changer. Du coup ils fournissent un fichier de même nom pour que leur classe soit incluse à la place de l'originale. Le problème c'est de savoir quel module (et donc quelle classe) doit être utilisée, celle du module A ou celle du module B ? 2/ Quand j'ai plusieurs gestionnaires (pas forcément appartenant au même module), il faut savoir dans quel ordre les lancer. On ne va pas lancer le gestionnaire d'affichage avant le gestionnaire de transformation, ça n'aurait aucun sens. Pour ces deux problèmes il y a deux manières de gérer la choses : - à la main, en laissant l'utilisateur éditer un fichier de conf qui liste les modules, les gestionnaires, et l'ordre à utiliser au milieu - en automatique, en laissant chaque module faire ses propres déclarations du type "Je suis le module M, je suis prioritaire par rapport aux modules A et B, j'implémente les gestionnaires X et Y, X doit absolument être exécuté avant Z, Y doit absolument être exécuté avant W" Faire tout en manuel est trop complexe même pour un geek. Ordonner les modules peut être gérable, ordonner les gestionnaires ça va devenir très lourd. Du coup on doit faire ça en automatique (en plus ça me semble plus cohérent). Après vient mon problème de performances. Pour ordonner tout ce bordel il faut que je fasse des explorations de répertoire, que je lise X fichiers XML, que je les interprête, que je balance ça dans des arbres, que je fasse un tri topologique sur ces arbres, et finalement que je récupère le résultat dans une bête liste ordonnée. Tout ça prend du temps. Je n'ai aucune idée du combien de temps mais ce n'est à mon avis pas pertinent de lancer toute l'usine à gaz à chaque exécution, vu qu'on ne change pas de module tout les jours. Du coup il va être nécessaire d'avoir une bêbête qui va lancer tout ces tris et les stocker en cache (soit sur demande soit régulièrement en cron, comme vous voulez, le problème n'est pas là ). à partir du moment où j'ai une génération du cache manuelle de certaines infos, on peut en profiter pour réduire quelques problèmes de performances. Mes problèmes de performances sont les suivants : 3/ explorer tous les répertoires pour lister les fichiers de conf, les ouvrir, les interprêter à base de regexp et construire des tableaux. Même avec un cache ça nécessite au minimum X listages de dossier, X ouverture de fichiers et X stat(), où X est le nombre de modules. 4/ lors de l'autoload je comptais lister tous les rep des modules en include_path, ou faire explorer ces répertoires à la fonction d'autoload (peu importe, ça revient en gros au même). Mais avec le nombre de chargements à chaque exécution le coût devient réel. Il faudrait pouvoir savoir exactement où est le bon fichier à inclure (que ce soit en construisant un index ou en recopiant les fichiers dans un rep commun) Ces problèmes de performances ne sont pas dramatiques et on peu faire avec mais bouger les classes ou changer la config n'est pas non plus une activité qu'on fait toutes les 5 minutes. Il me parait possible de faire ces activités une fois pour toutes lors du tri des modules et mettre les infos en cache. Si on change la config il suffira de relancer un tri, ce n'est pas dramatique. Pour la configuration ça nous permet même de ne charger lors des exécutions de lecture une classe qui ne fait que lire un tableau associatif : aucun appel aux fichiers, aucune exploration, aucune interpétation. On réserve la classe de lecture/écriture aux fonctions d'admin (dont le tri des modules) Commencer à éliminer les problèmes de performance avec quelques générations à la demande ouvre aussi la porte à certains problèmes que j'avais sur les XSLT ou sur les classes ? comment plusieurs modules peuvent dériver une classe ? si B et C rajoutent des fonctionnalités à la classe générique A, il faudrait que C hérite de B qui hérite de A, sauf que ça nécessite de faire des dépendances fortes entre tous les modules (et on perd la possibilité d'en rajouter/enlever/remplacer). Pour les XSLT le problème est le même, mais plus important. Si on veut qu'un module puisse insérer des choses dans le XSLT sans intervention manuelle, il faut qu'il puisse y ajouter des lignes (au moins un <import>, et pas que remplacer les anciens XSLT. Faire des générations à la demande permettra dans le futur de "construire" certains fichiers dynamiquement. Même si on n'implémentera certainement pas tout ça dans un premier temps, je pense que c'est nécessaire de le prévoir. Voilà voilà -- Eric Daspet Venez aider notre mangeur de cigogne sur http://mangeur-de-cigogne.info/