Développement

Quelques notes pour répondre à des problématiques rencontrées au travail.

eZ Publish : fetches et performances (datamap)

Accéder au datamap d’un nœud (eZContentObjectTreeNode) ou d’un objet (eZContentObject) est assez consommateur de ressources. Lorsqu’il n’y en a qu’un, on ne s’en rend pas compte. Mais quand on se trouve dans une boucle, cette requête est répétée n fois, et les performances s’en retrouvent affectées. Je vais vous présenter deux méthodes pour précharger le datamap dès la récupération des nœuds ou objets. Le gain s’évalue en millisecondes, voire même en secondes.

Fetch de noeuds en indiquant de charger le datamap dans la même requête :

$params = array(
    'ClassFilterType' => 'include',
    'ClassFilterArray' => array('article')
    'LoadDataMap' => true
);
$nodes = eZContentObjectTreeNode::subTreeByNodeID($params, 7348);

Fetch d’objets avec chargement du datamap à posteriori, en deux requêtes :

$objectIDs = array(34, 35, 85, 50, 51, 107, 108, 109); // Tableau de ContentObjectIDs
$objects = eZContentObject::fetchIDArray($objectIDs);
eZContentObject::fillNodeListAttributes($objects);

Dans les deux cas la requête initiale est plus lourde, mais sur de nombreux éléments vous récupérerez largement ce temps perdu en accédant plus tard au datamap (que ce soit en PHP ou en template). Ainsi, lorsque vous utiliserez :

foreach ($objects as $object) {
    $datamap = $object->dataMap();
}

ou

foreach ($nodes as $node) {
    $datamap = $node->dataMap();
}

L’accès au datamap ne lancera pas de requête supplémentaire, il sera récupéré depuis le cache eZ Publish (celui en variables globales, pas celui stocké dans var/cache).

Pour estimer le gain de performances, vous pouvez mettre des timers avant et après le fetch. Le compteur de temps sera affiché dans le débug en bas de page, ainsi que dans var/log/debug.log.

eZDebug::addTimingPoint("Before fetch");
// Exécuter le fetch ici
eZDebug::addTimingPoint("After fetch");

Attention toutefois à ne pas utiliser ces méthodes si par la suite vous n’accédez pas explicitement au datamap ! Car elles restent plus consommatrices que de simples fetches, et pourraient pour de gros volumes de données vous mener à une fatal error de memory limit. En d’autres mots, ne les utilisez pas inutilement.

Publié le 04/04/2014
dans la catégorie Développement.
Dernière mise à jour le 03/06/2017.

Tags : ezpublish php

Commentaires

Poster un commentaire

Votre adresse e-mail ne sera pas affichée sur le site.