Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Salut à tous :-)
Je viens de remarquer quelque chose qui m'a paru assez étonnant étant donné que je ne connais pas trop le fonctionnement interne de ZF.
J'ai une partie de code avec une fonction récursive pour créer une structure de catégories (400) hiérarchisées (id, nom, id_parent), pour ensuite afficher un menu déroulant du type "Applications" sur Ubuntu (ou "Démarrer" sur Windows :-°)
J'ai créé ma structure de données de deux façons différentes. Dans la première solution, j'ai utilisé "$all_categories[$i]->id" ($all_categories de type Rowset) pour récupérer mes données de catégories, alors que dans la deuxième, j'ai utilisé $all_categories[$i]['id'] après avoir transformé mon Rowset (fetchAll()->toArray()). En comparant deux lignes de microtime() PHP je gagne apparemment 3,3 secondes avec la deuxième solution (sur une fonction récursive, théoriquement assez lourde) !
Les pages de mon application avec le code suivant inclut mettent 4.0 secondes à charger :
public function getCategories($reload = true) { if ($reload || !self::$_categories) { $select = $this->_table->select() ; $select->order('nom') ; self::$_categories = $this->_table->fetchAll($select) ; self::$_nb_categories = count(self::$_categories) ; } return self::$_categories ; } public function getCategoriesByIdRecursively($categorie_id) { $all_categories = $this->getCategories(false) ; $categories = array() ; for ($i = 0 ; $i < self::$_nb_categories ; $i++) { if ($all_categories[$i]->id_parent == $categorie_id) { $categories[] = array('id_categorie' => $all_categories[$i]->id, 'nom_categorie' => $all_categories[$i]->nom, 'categories' => $this->getCategoriesByIdsRecursively($all_categories[$i]->id) ; } } if ($categories) { return $categories ; } }
Alors qu'avec le code suivant au bout de 0.7 secondes mes pages sont chargées :
public function getCategories($reload = true) { if ($reload || !self::$_categories) { $select = $this->_table->select() ; $select->order('nom') ; self::$_categories = $this->_table->fetchAll($select)->toArray() ; self::$_nb_categories = count(self::$_categories) ; } return self::$_categories ; } public function getCategoriesByIdRecursively($categorie_id) { $all_categories = $this->getCategories(false) ; $categories = array() ; for ($i = 0 ; $i < self::$_nb_categories ; $i++) { if ($all_categories[$i]['id_parent'] == $categorie_id) { $categories[] = array('id_categorie' => $all_categories[$i]['id'], 'nom_categorie' => $all_categories[$i]['nom'], 'categories' => $this->getCategoriesByIdsRecursively($all_categories[$i]['id']) ; } } if ($categories) { return $categories ; } }
J'espère que cette information pourra servir à quelqu'un :-)
Hors ligne
Je suis allé voir dans le code du ZF parce que ça m'intriguait ton truc :
- c'est le foreach qui rame, c'est pas le row->id
- en gros c'est au moment de ton foreach que ton rowset instancie chaque row une par une, à mon avis c'est ça qui rame
- par contre quand tu fais ton rowset->toArray(), il part directement des données du rowset et ne crée à aucun moment les objets row...
Bref, belle optimisation, merci pour l'info
A+, Philippe
Hors ligne
Cela me fait penser à quelque chose, il manque des méthodes dans la classe Zend_Db_Table_Rowset_Abstract comme save() et autres. Lorsqu'on réalise des imports ou exports, il peut être courant que les enregistrements se comptent par centaines ou milliers (et plus).
Hors ligne
Pages: 1