Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Je me suis lancé, il y a de ça 2 semaines, sur un petit projet basé sur zf.
Ce projet est inspiré de Zend Platform, qui nécessite une licence payante, assez cher.
Alors bien sur, l'objectif n'est pas de rivalisé avec cette solution, car c'est tout bonnement impossible.
Cependant, mon idée est de proposer gratuitement, un système permettant la gestion d'événements (erreurs php, exceptions, éxecution lente, événement personalisé) et la visualisation du log interne de l'application.
ZFPanel serait fourni avec une interface graphique permettant la gestion des événement, logs, etc.
Il serait à la fois multi-utilisateurs et multi-projets.
Chaque projet a son propre fichier de configuration xml, de ce style :
<?xml version="1.0"?> <configdata> <production> <projectid>zfp1</projectid> <database> <adapter>PDO_MYSQL</adapter> <params> <host>localhost</host> <dbname>ZFPanel</dbname> <username>root</username> <password></password> </params> </database> <!-- Events parameters --> <events> <type> <custom>yes</custom> <exception>yes</exception> <phperror>yes</phperror> <slowexec> <activate>yes</activate> <relative>500</relative> <absolute>2000</absolute> </slowexec> </type> <param> <dump> <post>yes</post> <get>yes</get> <cookie>yes</cookie> <session>yes</session> <server>yes</server> <backtrace>yes</backtrace> </dump> </param> <email_alert>contact@netatoo.fr</email_alert> </events> </production> </configdata>
La mise en place de ZFPanel dans son application serait assez simple, elle nécésiterait la création d'une base de données (commune à tous les projets), et la mise en de ces quelques lignes au début du bootstrap :
require_once 'ZFP.php'; $zfp = ZFP::getInstance(); $zfp->setConfig('/conf/zfpanel_project.xml', 'production');
Ainsi, pour capturer toutes les exceptions, par exemple celles du Zend Framework, il suffirait d'étendre la classe Zend_Exception par ZFP_Core_Exception :
class ZFP_Core_Exception extends Exception { public function __construct($msg = NULL, $code = 0) { parent::__construct($msg, $code); new ZFP_Core_Event_Exception($this); } } Zend_Exception extends ZFP_Core_Exception {}
Pour les erreurs php (celle qui sont catchables par set_error_handler), elles sont enregistrées sans manipulation particulière, idem pour les slow execution.
Il serait également possible d'enregistrer des événements personnalisés :
... new ZFP_Core_Event_Custom('event name', 'event description'); ..
Voici quelques aperçu du projet en 0.0.1 :
System overview
Events list :
Events viewer :
Encore une fois, c'est loin de rivaliser avec Zend Platform du simple fait que ce dernier utilise des extensions php #C, donc c'est forcément plus rapide, de plus, ZP permet de faire beaucoups plus que ça en terme de gestion de performance, clustering, etc...
Cependant, cela peut être interessant pour ceux qui n'ont pas les moynes d'investir dans ZP, mais qui veulent avoir un suivi de leurs application...
Je mettrai en ligne le code source d'ici quelques semaines, j'attends d'avoir un base solide et assez stable pour la mettre en proposition.
Qu'en pensez vous ? (que ce soit graphiquement, que techniquement, et dans l'idée)
Simon
Hors ligne
L'idée est bonne. Il faut voir l'impacte du monitoring sur les perfs globale.
Hors ligne
En effet c'est un gros soucis que je m'efforce d'améliorer.
Cela necessite une instance de Zend Config, une autre de Zend Db, avec un cache c'est déjà un peu amélioré, mais il y a des solutions je pense.
Dernière modification par Phoenix17 (20-12-2007 00:23:09)
Hors ligne
En tout cas l'interface graphique a de la gueule !
Hors ligne
merci 2mx
Je suis en train de voir ce qui serait le plus intéressant : utiliser un fichier config.xml pour chaque projet, ou bien utiliser une table config de la base de données.
Chacun à ses avantages & inconvénient, mais utiliser la base de données aurait le sacré avantage de ne pas instancier Zend_Config, et surtout, permettrait un paramètrage plus rapide via ZFPanel...
A votre avis, qui sera le vainqueur ?
Hors ligne
Voilà une idée que je viens de concrétiser : l'affichage graphique du profiling des requêtes en utilisant Zend_Db_Profiler :
En l'occurence, ce serait une option activable uniquement pour les events de type "Slow execution" (sinon ca devient assez lourd, surtout si on utilise beaucoups les events custom).
EDIT : et j'ai finalement choisit la configuration multi-projets via une table de db plutot que Zend_Config. Après quelques profiling sous ZS, l'éxecution total du ZFPanel dans une application est entre 15 à 20 ms, correct ?
Dernière modification par Phoenix17 (19-12-2007 05:31:31)
Hors ligne
Très bon ca ^^
Hors ligne
ça a l'air vraiment sympatique ....
Hors ligne
Je suis actuellement en train de dév. une classe de benchmark, qui completera l'outil Profiler.
Par défaut, si l'application utilise Zend Framework, un plugin controller peut être ajouter afin de benchmarker la dispatchLoop ainsi que chaque action dispactcher.
Au niveau de l'affichage, je compte utiliser a peu près le même système d'affichage que le Profiler de Zend Studio (onglet trace d'appel).
Il serait tout à fait possible d'ajouter ses propres markers :
$profiler->markerStart('Zend//Controller//Front//dispatchLoop'); $profiler->markerStart('Zend//Controller//Front//dispatchLoop//myAction'); $profiler->markerEnd('Zend//Controller//Front//dispatchLoop//myAction'); $profiler->markerEnd('Zend//Controller//Front//dispatchLoop');
Permettra de manipuler un tableau associatif de ce genre :
array( 'Zend' => array( 'Controller' => array( 'Front' => array( 'dispatchLoop' => array( 'myAction => array() ) ) ) ) );
Ou chaque niveau du tableau contient un élément nommé '_bench' contenant un object de benchmark.
Je vous en dirai un peu plus, code à l'appui, ces prochains jours,
Joyeuses fêtes à vous
Dernière modification par Phoenix17 (24-12-2007 18:55:06)
Hors ligne
Voici un aperçu du module de monitoring permettant de visualiser graphiquement les benchmarks :
(j'ai volontairement placer un sleep(1) à l'intérieur d'un marker (ici dans le bootstrap))
La diode de marker est :
- verte lorsque son temps d'exec est inférieur ou égal à 1% du temps d'éxécution de toute la page
- jaune entre 1 et 49%
- rouge >= 50%
L'affichage / masquage des infos comme le % ou le temps d'exec en ms et secondes est fait en js. (a noter d'ailleurs que toute l'appli ZFPanel est WEB 2.0 (xhtml/css/ajax) et Prototype + Scriptaculous.
Pour l'instant, je n'ai pas prévu de jouer à 100% l'accéssibilité (ZFP fonctionne uniquement avec javascript activé et un navigateur moderne) du simple fait que ce type de solution est destiné à des développeurs avertis, et non au tout public.
Le module de benchmark serait activable uniquement pour les évènement de type 'Slow Execution', comme pour le Database Profiler.
Voila le plugin du controller permettant de profiler dans la mesure du possible :
require_once 'Zend/Controller/Plugin/Abstract.php'; class ZFP_Core_Controller_Plugin_Profiler extends Zend_Controller_Plugin_Abstract { /** * Contain instance of slow exec event * * @var ZFP_Core_Event_SlowExecution */ private $_profiler = null; /** * Contain list of marker names * * @var array */ private $_markerName = array( 'route' => 'Zend//Controller//Front//route()', 'dispatchLoop' => 'Zend//Controller//Front//dispatchLoop()' ); public function __construct() { $this->_profiler = ZFP_Core_Event_SlowExecution::getInstance(); } public function routeStartup(Zend_Controller_Request_Abstract $request) { $this->_profiler->markerStart($this->_markerName['route']); } public function routeShutdown(Zend_Controller_Request_Abstract $request) { $this->_profiler->markerEnd($this->_markerName['route']); } public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) { $this->_profiler->markerStart($this->_markerName['dispatchLoop']); } public function preDispatch(Zend_Controller_Request_Abstract $request) { $this->_profiler->markerStart($this->_markerName['dispatchLoop'].'//'.$request->getActionName().'Action'); } public function postDispatch(Zend_Controller_Request_Abstract $request) { $this->_profiler->markerEnd($this->_markerName['dispatchLoop'].'//'.$request->getActionName().'Action'); } public function dispatchLoopShutdown() { $this->_profiler->markerEnd($this->_markerName['dispatchLoop']); } }
Bonne journée
Dernière modification par Phoenix17 (26-12-2007 05:50:19)
Hors ligne
Bonsoir Seb,
Non je n'ai encore rien mis ni en ligne, simplement par manque de temps.
Car bien que l'interface graphique soit déjà clairement établie, au niveau du code c'est pas encore hyper bien organisé.
Egalement au niveau des performances ya pas mal de chose à faire.
Dans tous les cas, je compte rassembler l'ensemble des classes dans un mini projet nommé 'Zendex' (Zend Extensions) qui contiendra entre autre, les classes permettant la gestion des événements.
Je mettrai ça sur svn avec googlecode d'ici quelques temps, ce qui permettra à tout le monde d'y contribuer.
D'ailleurs, au niveau du nom du projet, j'hésite encore entre :
- Zendex (Zend Extensions)
- ZFX (Zend Framework Xtensions)
- ZendFx (Zend Framework Xtensions)
Votre avis ?
Dernière modification par Phoenix17 (02-01-2008 20:24:07)
Hors ligne
ZFX est pas mal utilisé dans le domaine de la 3D je pense.
Moi j'aime bien ZendFx (aucune réf dans GG en plus).
Je pense que ton projet est super et qu'il vaudrait même bien la peine qu'on lui fasse un petit site. Qu'est-ce que tu en dis ?
Hors ligne
Moi, je vote pour Zendex car c'est celui qui qui colle le mieux avec la casse de Zend.
Hors ligne
Nous (je ) sommes actuellement en train de (re)développer un "mur de codes" (packages, classes, modèles ... ) à la http://plugins.jquery.com/ pour le mettre à jour et le rendre plus accessible et mieux organisé.
Vous aurez toujours une place ici
Hors ligne
Seb a écrit:
ZFX est pas mal utilisé dans le domaine de la 3D je pense.
Ok, en plus il y a déjà un projet utilisant cette extension http://code.google.com/p/zfx/
Hors ligne
On avait pensez à ZFE (ZF_Extended) un moment, phillipe devait nous créer un svn et un projet dans l'activecollab.
Effectivement beaucoup d'idées arrivent c'est cool
Hors ligne
Bonjour ça en est ou ce projet?
Hors ligne
J'avais contacter Zend pour platorm et suite à leur proposition, je leur avais dit que j'attendais la version de Phoenix hors il m'a dit 'zend staff' que phoenix était un de leur client qui possèdait platform et qu'il trouvait bizarre de voir apparaitre ce Panel. Peut être que Panel était basé sur platform ... bizarrement pu de nouvelle depuis de nombreux mois ...
Hors ligne