|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Bonjour à tous.
Je commence à être de plus en plus inquiet à propos des problèmes de performances de mon composant Axiom. Selon les installations, le temps nécessaire au boostrap occupe entre 15% et 40% du processing total... J'aimerai grandement améliorer ces performances désastreuses. Actuellement, le boostrap consiste en un ensemble de fichiers de configurations PHP lus successivement avant de lancer le routeur, ce comportement est exprimé ici: https://github.com/bdelespierre/php-.../bootstrap.php J'ai pensé à utiliser un cache pour corriger le problème ou utiliser un fichier unique (INI, JSON ou XML) lu une seule fois et utilisé par les différentes classes mentionnées plus haut. Selon vous, quelle serait la meilleure façon de procéder ?
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : septembre 2010 Messages : 7 219 ![]() |
normalement t'as pas a faire de require, avec l'autoloader les classes se chargent suivant le besoin, pour le reste un fichier de conf suffit
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#3 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Le but du bootstrap est moins de charger explicitement les librairies que de charger les configurations à l'intérieur desdites classes.
Ex: Code :
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||
|
00
|
|
|
#4 |
![]() ![]() Inscription : septembre 2010 Messages : 7 219 ![]() |
tu peux faire un ini, le boostrap le lit, si y'a une config dans Lang par exemple il chargera la conf, sinon il fait rien
ou alors faire l'inverse le module fera un getConfig
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#5 | |
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 727 ![]() |
Salut
As tu tenté de mettre en place une sorte de benchmark (ou profiler) pour savoir quelle partie du boostrap causerait problème, ou serait anormalement lente ? (Pas mal de FrameWork intègrent ça, sous forme de module ou autre). Citation:
L'autoloader ne se charge t-il pas d'instancier seulement la classe, mais pas de l'inclure ? (enfin, j'ai toujours compris ça comme cela).
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|
|
|
00
|
|
|
#6 | ||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
J'avais envisagé l'éventualité d'un fichier ini, chargé dans un singleton de config qui serait lu par les modules une fois ceux-ci chargées. Ce qui évite des définitions inutiles si les modules en question ne sont pas utilisés.
Citation:
Bref, vu que tous ces modules ne sont pas utilisés à chaque requête, c'est un peu débile de les charger systématiquement. Citation:
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||
|
00
|
|
|
#7 | ||
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 727 ![]() |
Citation:
![]() C'est pas grave. Citation:
Tu recherche juste un moyen de rendre ce FrameWork plus modulaire : On y charge QUE ce qui est utile. En tout cas, si tu recherche quelque chose de rapide, de simple tableaux de config seront à mon plus rapide que des INI, XML et consoeurs, ces derniers demandent à être lus/parcourus, même s'il existe des fonctionnalités au coeurs de Php. Kohana par exemple utilisent des tableaux. Un premier tableau dans le bootstrap qui liste les modules à charger. Puis chaque module doit avoir un répertoire config, et là aussi toutes les configs sont dans un tableau. De plus, quand il s'agit de module présents dans le FrameWork (et non un module perso), les modules du core prévois de configs par défaut (à le pas modifier à ce niveau). Au bout, par défaut ça charge les configs du core, sinon, ça charge celles qu'on aura personnalisé/redéfinies coté applicatif. C'est juste pour exemple. En tout cas c'est extrêmement performant (du moins c'est ce que je remarque).
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
||
|
|
00
|
|
|
#8 | |||||
|
Expert Confirmé
![]() Olivier Développeur Web Inscription : août 2003 Messages : 1 837 ![]() |
Quelques pistes de réflexions :
- Le bootstrap est appelé à chaque page (comme le frontcontroller) c'est donc un fichier qui doit aller à l'essentiel. Au contraire tu y charges tout tes modules. c'est, je pense, la première erreur. Soit utiliser un autoload soit laisser l'utilisateur charger les bonnes classes quand il en a besoin serait déjà pas mal. Citation:
Encore une fois il faut je pense laisser l'utilisateur modifier le comportement des différents modules en lui laissant accès à différents getter/setter. perso quand je code et qui faut que je me tape un fichier de config à remplir , ca me gonfle royalement , encore plus si le dit fichier est dans un format à la con. - J'ai pas vu à quoi ressemblait tes fichiers de config , mais essai de favoriser au maximum des solutiond qui savent être lu nativement par php (json,ini) et qui ne nécessite pas un travail de parsage trop important (xml). - Profiter de l'intégration de APC dans PHP peut être intéressant (typiquement lire une fois le fichier de conf puis venir chercher les infos en mémoire par la suite) Pour te donner une idée , le seule fichie rde config d'une appli utilisant mon framework ressemble à ça : Code :
qui correspond à la configuration de deux autoloader : Code :
|
|||||
|
00
|
|
|
#9 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Merci de consulter le code des modules concernés par le bootstrap avant de répondre dans ce topic SVP.
Bon on va corriger le tir. Le bootstrap ne charge pas l'intégralité des modules du framework, l'Autoloader s'en charge au runtime. En revanche, le bootstrap charge les classes à configurer (sans faire appel à l'autoloader pour éviter les appels inutiles). On se retrouve donc avec un fichier PHP par module à configurer, ce qui devait dans l'idée permettre au programmeur de ne pas charger certains modules (comme RSS ou Log par exemple). Actuellement, la configuration n'est pas portée par un fichier INI ou XML, elle est définie "en dur" dans le fichier de configuration PHP. Je souhaite changer ce comportement pour que les modules aillent lire leur configuration en best effort sans pour autant introduire une dépendance fonctionnelle entre ces modules et une classe de configuration (et encore moins avec des variables globales, cela va sans dire). Ensuite, mes modules se suffisent à eux même, il sont, dans la mesure du possible, faiblement couplés entre eux et leur configuration reste optionnelle (seul l'appel à la méthode statique setConfig pour initialiser la conf du module par défaut est mandataire). Vu qu'un grand nombre de ces classes ne portent que des méthodes statiques, je vais peut être avoir besoin d'utiliser le pattern Singleton (ce sera d'ailleurs pas plus mal s'il faut mettre la conf en cache...) @grunk Dans l'exemple que tu propose, comment les modules chargés par l'autoloader lisent leur conf en réalité ?
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
00
|
|
|
#10 | |
|
Expert Confirmé
![]() ![]() |
Bonsoir Benjamin,
juste une petite chose en passant : vu les problèmes que tu sembles rencontrer, es-tu toujours sûr de ça : Citation:
![]()
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
|
|
00
|
|
|
#11 | |
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 727 ![]() |
Citation:
php-axiom / libraries / captcha / config.php (ou config.ini) php-axiom / libraries / feed / config.php ... etc ... La classe chargera alors les configs à ce niveau là. Enfin, c'est une idée.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|
|
|
00
|
|
|
#12 | |||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Citation:
![]() On pourrait remplacer par Citation:
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|||
|
00
|
|
|
#13 | |
|
Expert Confirmé
![]() Olivier Développeur Web Inscription : août 2003 Messages : 1 837 ![]() |
Citation:
Si je prend l'exemple du singleton pdo ou de l'envoi de mail qui eux on besoin d'info supplémentaire pour fonctionner : Mon fichier ini est lu dans l'index.php (frontcontroller) de l'appli , un objet de config est crée. Selon le besoin cet objet est mis en cache ou non. Je passe ensuite la "config" supplémentaire à l'instanciation de l'objet concerné. Par exemple pour utiliser Zend_Db qui est intégré dans mon framework je fait simplement : Code :
Zend_Db::factory($objConfig->database); On peut avoir une idée des tests que tu as réalisé et des résultats ? Tu t'inquiètes peut être pour pas grand chose |
|
|
00
|
|
|
#14 | ||||
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
Le mien non plus n'est pas une foudre de guerre, on parle d'une moyenne de 100 à 300 ms par requête...
Exemple: une page du module d'admin comprenant des helpers de vue et des requêtes MySQL dure 325ms (+200 appels) et le boostrap dure à lui seul 147ms (même si on enlève les 55ms de PDO, il nous reste 92ms soit 1/3). J'ai commencé à écrire des classes pour manipuler des fichiers de conf INI en m'inspirant de Zend_Config_Ini: Code :
Code :
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
||||
|
00
|
|
|
#15 |
|
Expert Confirmé
![]() ![]() |
Bonjour,
Sans avoir la possibilité d'accéder un cache, il est quand même possible d'accélerer le chargement des éléments toujours utilisées dans ton framework. Un peu comme le fait Yii avec son fichier Yiilite.php. C'est un fichier généré automatiquement qui regroupe en un seul bloc toutes les classes nécéssaires au bon fonctionnement de 80 à 90% des classes et fonctionnalités du framework. Cela n'empêche pas la conservation des classes dans ton arborescence mais tu y gagnes beaucoup en temps de parseur et d'inclusion. Sans cache tous les moyens sont bons pour gagner en vitesse (et je sais de quoi je parle) Enfin, je te renvoie à ma classe de minification du code PHP qui elle aussi d'après mes tests sur mon framework fait sacrément économiser du temps au chargement. Regardes ici pour la discussion, et ici pour la source. Bref, yapuka faire des essais.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
|
00
|
|
|
#16 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 991 ![]() |
L'idée est séduisante mais je vais devoir t'emprunter l'idée et coder une dérivation de ce travail car mon code doit rester compatible 5.2 et surtout qu'il est publié en LGPL et le tien en GPL.
Mais c'est un concept intéressant, je vais m'en servir.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
00
|
|
|
#17 | |
|
Expert Confirmé
![]() Olivier Développeur Web Inscription : août 2003 Messages : 1 837 ![]() |
Citation:
![]() En gros 26 ms pour l'instanciation et 4 requêtes , d'où mon étonnement pour tes 50 ms. Je viens de faire un profiling chez moi et très clairement ce qui me prend le plus de temps c'est le moteur de template (twig) et du coup je tourne également à une moyenne de 300 ms par page. avec un cache sur le template je suis en moyenne à 80ms. Bon après si tes test on été fait sur une machine peut puissante ou php 5.2 ça peut expliquer cette différence. |
|
|
00
|
|
|
#18 | |
|
Expert Confirmé
![]() ![]() |
Citation:
Normalement tout devrait rouler pour ta version.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
|
|
00
|
|
|
#19 |
![]() ![]() Inscription : septembre 2010 Messages : 7 219 ![]() |
on gagne pas grand chose par rapport a un php_strip_whitespace
__________________
http://blog.stealth35.com/ |
|
|
00
|
|
|
#20 |
|
Expert Confirmé
![]() ![]() |
Oui sur un seul fichier c'est sûr mais sur une branche complète d'un framework ou le framwork entier, le gain est énorme.
Ensuite la différence entre un php_strip_whitespace() et la réécriture optimisée du code est certes ridicule en terme de gain mais quitte à faire un outil autant qu'il pousse au-delà de la simple fonction native. Avec php_strip_whitespace() tu perds le rendu dans les notations heredoc/nowdoc, dans mon cas c'était problématique, c'est pour ça que je suis parti des tokens bruts en faisant attention à bien préserver cet aspect.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile... |
|
00
|
Copyright © 2000-2012 - www.developpez.com