Magento se base sur un modèle de données EAV pour la gestion de certaines données (catégories et produits il me semble). Un modèle EAV pour les nouveaux, c’est un modèle de base qui décomposent chaque objet en Entités, Attributs et valeurs (lire l’article précédent : MAGENTO : MODÈLE EAV – ENTITY ATTRIBUTES VALUES). Un gros défaut de ce modèle, est sa performance, qui pour extraire un objet de la base va obliger le système à réaliser de nombreuses jointures… Un énorme avantage est sa flexibilité…

Pour apporter une solution au performances de Magento et de son modèle EAV, une option de configuration permet de produire un « Magento flat catalog »… Le principe est simple, plutôt que d’utiliser les tables EAV et les jointures associées, Magento va générer de nouvelles tables avec les attributs indiqués dans la configuration pour créer des tables catégories et produits et éviter les multiples jointures.

Mes recherches sur internet sur le sujet indiquent un gain situé entre 50% et 75% du temps de réponse, mais cela me semble quasi impossible à vérifier, et je n’ai pas de chiffre à donner (cela dépend de l’infra, du code, de la méthode de mesure… bref fiable…?).

Quelques astuces…

1) Activer le Magento Flat Catalog

  • Allez dans « Système -> Configuration -> Catalogue »
  • Cochez : « Utiliser une catégorie de catalogue fixe » (aie la traduction…)
  • Cochez : « Utiliser un produit de catalogue fixe »

Bien-sur, vous ne le faites pas en production, mais vous validez le site sur un environnement de test 🙂

Ensuite, pour vos tests :

  • Vous désactivez tous les caches
  • Vous ouvrez un navigateurs, et à ce stade, deux options… Vous ressentez le besoin de lire la suite, ou votre site s’affiche fonctionne, vous mettez à profit votre temps pour féiciter votre equipe de dev…

… Oui… vous lisez la suite… 🙂

2) Mon menu de navigation à disparu ?

C’est un problème qui arrive souvent. Si votre menu de navigation affiche un arbre de contenu, vous avez sans doute utilisés la méthode $category->getChildren()… qui ne fonctionne pas avec un flat catalog.

La solution est assez simple :

if (Mage::helper('catalog/category_flat')->isEnabled()) {
     $children = (array)$category->getChildrenNodes();
     $childrenCount = count($children);       
} else {
     $children = $category->getChildren();
     $childrenCount = $children->count();
}

Oui, il faut utiliser getChildrenNodes() et non getChildren(). Vous notez que dans le cas d’un flat catalog, vous recevez un « Array », la méthode count de l’objet n’est donc pas utilisable et remplacée par un « count » php classique.

3) Les attributs qui disparaissent

Il peux manquer des attributs dans les tables du « Magento Flat Catalog ». Par exemple les customs que vous avez ajoutés. Les remettre est très simple, il vos suffit de :

  • 1) Ouvrir l’attribut via le back office magento ( catalogue -> atributs -> gérer les attributs ).
  • 2) Trouver et éditer l’attribut.
  • 3) Mettre à oui la valeur de « Utiliser dans les listes de produits » (en anglais : « Used in Product Listing »)

Ensuite, il faut reconstruire les indexes, et vos attributs sont disponibles…

Pour cela deux méthodes, soit :

– Via le back office : Système -> Gestion des indexes.
– En ligne de commande :

cd [votre_chemin]/shell
php indexer.php --reindexall


magento-indexing

Ecran de reconstruction des indexes Magento

4) Si je te vois faire ça je me fache !!!!??!!…

Je suis tombé sur ce bout de code lors d’une mission… Et non, ce n’est pas une bonne solution, il ne faut surtout pas faire cela…

$tempCollection = Mage::getResourceModel('catalog/product_collection');
$tempCollection->getSelect()->order('rand()');
$tempCollection->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());
 
$tempCollection = $collection->addAttributeToSelect('*')
    	->addFieldToFilter(array(array('attribute'=>'homepage','eq'=>'1')))
    	->setPageSize(9)
    	->setCurPage(1)
    	->addStoreFilter(Mage::app()->getStore()->getId());
 
$collection = new Varien_Data_Collection();
 
foreach ($tempCollection as $item){
 
	$product = Mage::getModel('catalog/product')->load($item->getEntityId());
	$collection->addItem($product);
 
}
     	
retun $collection;
 

L’erreur la plus moche vient de la boucle en charge de re-créer une collection avec les produits de la première collection dans le simple but de completer des attributs absents…. C’est très moche, très lent, à ne pas faire. Vous avez une tentation de faire cela ? Relisez le paragraphe 2 🙂

5) Autres pistes après le magento flat catalog…

Pour optimiser votre plateforme Magento, investiguez :

  • Le cache des blocks, est-il bien réglé sur les block customs
  • Un cache d’opcode est-il installé sur le serveur ? APC?
  • Un cache tel que Varnish en amont de votre plateforme ?
  • Enfin, pourquoi ne pas simplement utiliser Nitrogento et son cache de pleine page ?(très efficace chez moi)

Votre magento flat catalog est sur la bonne route pour fonctionner correctement….

En savoir plus ?