Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour,
Etant donné mon statut d'apprenti avec le zend j'ai quelques questions que j'aimerais vous soumettre.
En utilisant l'accès aux bases de données tel que définit dans les tutoriaux, j'utilise zend Table, qui me renvoie donc mes valeurs, mais aussi à chaque fois quantités d'informations comme les types des tuples, le nom de la table, et autres variables.
De plus quand je veux retourner quelques variables d'une ligne avec fetchall, je ne peux retourner que toute la ligne.
Je ne peux bien entendu pas croire que dans un souci d'optimisation, pour un portage en production l'on puisse utiliser cette solution.
Aussi j'aimerais savoir comment vous faites. J'ai étudiez les autres classes. Ce serais la classe la plus basse en abstraction, à savoir Zend Db Adaptater qui m'interresserais, mais je n'arrive pas à la déclarer en statique, dans mon bootstrap, autrement qu'àvec le register, or j'aurais aimé quelquechose d'aussi transparent que " $db = Zend_Db::factory($config->db);
Zend_Db_Table::setDefaultAdapter($db);". De la meme facon retrouver le _DB dans les classes pour faire un select ne me plais pas beaucoup.
J'ai l'impression que l'accès à ma base de données est lent avec Zend Table, je prévois de faire un grand site avec une forte affluence, dois je me passer de Zend DB ?
Devrais je recréer une classe d'accès à une BDD mysql ? Avec accès qui renvoie uniquement des tuples, où l'on pourrais faire de vrai "SELECT A,B" qui renverrais uniquement A et B par exemple.
Comment faites vous ?
Cordialement,
Hors ligne
Le deuxième parametre de from('table', array('A', 'B') ) permet le SELECT A,B FROM table :
public function getAll() { $select = $this->select (); $select->from( $this, $cols= array('avion_id', 'avion_nom') ); $r= $this->fetchAll ( $select ); $query = $this->profiler->getLastQueryProfile(); Zend_Debug::dump($query->getQuery(), 'La requete :'); return $r; }
Concernant la mesure des performances, une piste est d'utiliser le profiler $this->profiler = $db->getProfiler();
Hors ligne
Utilisez setDefaultMetadataCache().
Utilisez impérativement des vues en lecture, surtout pas de findDependent(), findParent(), etc.....
Essayez au maximum de déporter la logique de gestion des données dans le SGBD : vues, triggers, procédures stockées (Mysql >=5 fait ça à merveille, et même plus encore)...
Hors ligne
fte a écrit:
Le deuxième parametre de from('table', array('A', 'B') ) permet le SELECT A,B FROM table :
Code:
public function getAll() { $select = $this->select (); $select->from( $this, $cols= array('avion_id', 'avion_nom') ); $r= $this->fetchAll ( $select ); $query = $this->profiler->getLastQueryProfile(); Zend_Debug::dump($query->getQuery(), 'La requete :'); return $r; }Concernant la mesure des performances, une piste est d'utiliser le profiler $this->profiler = $db->getProfiler();
Depuis quelle classe ?
Hors ligne
Julien a écrit:
Utilisez setDefaultMetadataCache().
Utilisez impérativement des vues en lecture, surtout pas de findDependent(), findParent(), etc.....
Essayez au maximum de déporter la logique de gestion des données dans le SGBD : vues, triggers, procédures stockées (Mysql >=5 fait ça à merveille, et même plus encore)...
En toute modestie, je ne suis pas trop daccord pour qu'à chaque fois que l'on parle performance avec le zend l'on parle de caching. Je pense essayer de cacher mais plutot sur la fin de mon développement. Pour le moment j'essaye d'appliquer une logique d'un minimum d'économie niveau performance par exemple.
Julien, Quelle classe utilise tu pour accéder à ta BDD ?
J'ai oui dire d'utiliser mysqli. Mais bon je n'y connais pas grand chose.
Quelle est la meilleur facon d'accéder à une base de données via Zend si l'on n'a pour contrainte qu'un impératif de performance ????
Hors ligne
Bonjour DarKA,
En général quand tu utilises des ORM (object relationnal mapping), tu récupères des objets entiers, même si tu n'as pas besoin de tous les paramètres. Effectivement en termes de perfs, ça n'est pas forcément optimal. Cependant le plus long dans une requête est souvent de trouver la bonne ligne, pas forcément de renvoyer toutes les données.
Donc clairement, un ORM a pour objectif d'accélérer et de fiabiliser les développements, mais c'est au détriment des perfs. Si tu as une requête super lourde que tu fais tout le temps, tu as intérêt à faire ta requête à la main, mais en général, ça concerne 2 ou 3 requêtes dans un site et les 80 autres requêtes ne sont pas critiques en termes de perfs, tu peux alors utiliser le confort de ton ORM...
(oui, je sais c'est une approche anti-puriste au possible, mais si on veut être rentable sur du dev de site, il faut souvent optimiser plus le temps de dev que les perfs de l'appli à l'arrivée, tant qu'on reste dans le raisonnable...)
A+, Philippe
Hors ligne
DarKA a écrit:
fte a écrit:
Le deuxième parametre de from('table', array('A', 'B') ) permet le SELECT A,B FROM table :
Code:
public function getAll() { $select = $this->select (); $select->from( $this, $cols= array('avion_id', 'avion_nom') ); $r= $this->fetchAll ( $select ); $query = $this->profiler->getLastQueryProfile(); Zend_Debug::dump($query->getQuery(), 'La requete :'); return $r; }Concernant la mesure des performances, une piste est d'utiliser le profiler $this->profiler = $db->getProfiler();
Depuis quelle classe ?
Oup oublié de préciser, c'est dans le modèle.
Ca peut ressembler à ça :
class Avion extends Zend_Db_Table_Abstract { protected $_name = 'avion'; // nom de la table sql protected $_primary = array( 'avion_id' ); // cle primaire /** * init * * initialise le profiler pour debogguer les requetes SQL * */ public function init() { $db= Zend_Registry::get('dbAdapter'); $this->profiler = $db->getProfiler(); } public function getAll() { ...
Hors ligne
Personnellement, PDO_MySQL, mais avec des vues ( toutes les dépendances sont déja résolues dans la vue, surtout pas de findParentRow() ou findDependentRowset() )
Des triggers (create trigger on insert ), et des proc stock.
La base de données est un goulot d'étranglement classique dans une appli, et maitriser chaque requête est indispensable. J'ai d'ailleurs un système de cache avec APC de mes Rows et Rowset, ainsi que de mes queries.
Hors ligne
Julien a écrit:
La base de données est un goulot d'étranglement classique dans une appli, et maitriser chaque requête est indispensable. J'ai d'ailleurs un système de cache avec APC de mes Rows et Rowset, ainsi que de mes queries.
Bonjour,
Auriez-vous un exemple d'utilisation d'APC de cette manière ?
J'ai qq soucis de perf sur une appli et je cherche une solution.
Merci d'avance
Hors ligne