Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 30-07-2008 10:30:00

DarKA
Membre
Date d'inscription: 18-07-2007
Messages: 84

Zend DB performance + mysql

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

 

#2 30-07-2008 11:40:55

fte
Membre
Lieu: 06 13 83
Date d'inscription: 16-05-2008
Messages: 112
Site web

Re: Zend DB performance + mysql

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();

Hors ligne

 

#3 30-07-2008 13:00:26

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: Zend DB performance + mysql

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

 

#4 30-07-2008 13:04:37

DarKA
Membre
Date d'inscription: 18-07-2007
Messages: 84

Re: Zend DB performance + mysql

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

 

#5 30-07-2008 13:08:34

DarKA
Membre
Date d'inscription: 18-07-2007
Messages: 84

Re: Zend DB performance + mysql

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

 

#6 30-07-2008 14:11:42

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: Zend DB performance + mysql

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


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#7 30-07-2008 14:15:10

fte
Membre
Lieu: 06 13 83
Date d'inscription: 16-05-2008
Messages: 112
Site web

Re: Zend DB performance + mysql

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 :

Code:

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

 

#8 02-08-2008 12:36:30

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: Zend DB performance + mysql

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

 

#9 13-08-2008 12:19:17

ramsesservices
Membre
Date d'inscription: 13-08-2008
Messages: 10

Re: Zend DB performance + mysql

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages