PHP, XML et XSLT : point de situation
Par Armel FAUVEAU, mercredi 21 août 2002 à 13:07 :: Lu sur le Web :: #537 :: rss
On parle de plus en plus de parsing XSLT depuis PHP. Le plus souvent, il est alors question de Sablotron. Il semblait intéressant de faire un point de situation sur ce sujet en cherchant à évaluer les performances de ce parseur. Mais aussi tenter de mettre en lumière certaines alternatives peu connues.
Constat Préalable
Au stade actuel de mes investigations, je peux affirmer les choses suivantes :
• si Sablotron est la seule implémentation officielle (nous verrons qu'il y en a d'autres...) en terme de parsing XSLT depuis PHP, elle reste cependant globalement mauvaise en terme de performances.
• les performances de Sablotron chutent rapidement lorsque le traitement XSLT tend à devenir un peu évolué (et encore, je n'ai pas dit complexe voir touffu ce qui peut vite devenir le cas).
• les performances de Sablotron chutent encore plus rapidement en fonction du volume de données XML à traiter. Vous me direz que c'est un peu normal, certes ! Mais dans le cas de Sablotron, l'asphixie survient vite. Est-ce un problème de type memory leak ou autre, je n'ai pas creusé. Mais le constat est là.
Bref, le seul parseur XSLT officiel coté serveur dont nous disposons depuis notre langage préféré, même s'il s'est amélioré énormément ces derniers mois (rappelez vous les performances initiales vraiment médiocres), reste...décevant !
Alors que faire ?
La première idée que j'ai expérimenté consiste à utiliser xsltproc. Si vous avez Gnome sur votre machine, il y a fort à croire que vous disposez de ce parseur accessible en ligne de commande. Il est installé lors du déploiement de l'excellente Libxslt sur laquelle il se plugue.
Si vous avez des traitements batch de transformations XML / XSLT à faire, xsltproc apparait comme tout à fait adapté. Mais il est évidement également possible de l'invoquer depuis PHP via exec() ou system(). Certes, si le but (et c'est un peu celui qui nous intéresse) est de générer une sortie HTML à la volée, ce n'est pas forcement optimal. Et pourtant...les performances sont déjà bien meilleures que celles offertes par Sablotron ! En moyenne, l'appel de ce parseur en ligne de commande via system() permet de servir 2 fois plus de requêtes par seconde !
Mais il devait y avoir encore mieux :)
En fouillant un peu dans les sources de PHP et en regardant de plus près l'extension DOM, vous aurez peut-être la surprise de constater que DOM intègre déjà un premier support de XSLT (et même de eXSLT pour celles et ceux qui connaissent). Ce support repose lui aussi sur la Libxslt qui décidément fait clairement office de référence.
En fait, le nombre d'extensions et ou de fonctions non documentées dans les sources de PHP est assez impressionnant. Pour qui prend le temps de regarder un peu, il y a de quoi s'occuper (café ou amphet' conseillé !).
Il restait donc à trouver le modus operandis afin de tester ce support XSLT intégré à DOM mais non documenté. Et à nouveau un gain significatif à la clef !
Si vous voulez activer ce support DOM XSLT, l'approche est la suivante (avec PHP 4.2.1, je n'ai pas testé avec PHP 4.2.2 ou la version en CVS):
lors de la compilation et du ./configure, préciser '--with-dom' '--with-dom-xslt' '--with-dom-exslt'.Evidement, vous devez disposer de la libxslt (vous l'avez déjà probablement, mais vérifiez le).
Cas concret
Je termine par les résultats d'un premier bench obtenu sur un cas concret afin de se fixer les idées.
J'ai choisi de bencher la génération d'une page Web classique (une page du site de GLOBALIS), dans les conditions suivantes : tout d'abord j'ai mesuré le nombre de requètes / s délivrait par une génération dynamique classique via PHP et MySQL (avec intégration de quelques données présentes en base). Mais vu la simplicité des traitements et le peu de données lues en base, c'est limite si le serveur ne délivrait pas des pages plus ou moins statiques tant le traitement dynamique était peu important.
Puis, j'ai mesuré les performances obtenues avec le parsing d'une feuille XML par XSLT. Dans ce cas, les données étaient déjà présentes dans la feuille XML. La feuille XSLT servait à appliquer la mise en forme.
Notez que l'enrichissement dynamique de la feuille XML à la volée par l'intégration de quelques données en base, changeait peu les résultats. De toutes façons, il est clair que dans le cas qui nous intéresse ici, le premier goulet d'étranglement était le parsing XSLT, pas vraiment le fait d'aller chercher 2 ou 3 données en base pour les intégrer au flux XML. J'avais tout de même conservé l'ouverture et la fermeture de la connexion au SGBD (étape qui consomme toujours un peu de temps CPU).
Le bench a été effectué sur un Bi-P3-700 en montant à 30 accès concurrents et 500 requêtes.
Cela donne quoi ?
Les résultats sont les suivants :
• PHP + MySQL : environ 120 req/s
• PHP + Sablot : environ 25 req/s (bad news)
<? ... $handle = xslt_create(); print xslt_process($handle,'feuille.xml','feuille.xsl'); xslt_free($handle); ... ?>• PHP + xlstproc : environ 42 req/s
<?
...
print system("xsltproc feuille.xsl feuille.xml");
...
?>
• PHP + DOM XSLT (non documenté) : environ 65 req/s
<?php
...
$xslt = domxml_xslt_stylesheet_file('./feuille.xsl');
$xml = domxml_open_file('./feuille.xml');
$html = $xslt->process($xml);
print($html->html_dump_mem());
...
?>
Les performances potentielles (puisque encore au stade expérimental) du support DOM XSLT sont donc très acceptables !A noter que si l'on joue sur le volume de données à traiter (flux XML plus ou moins important), la Libxslt s'essouffle beaucoup moins rapidement que Sablotron (que ce soit via l'appel à xsltproc ou via le support DOM XSLT).
Conclusion
Je termine sur une remarque. Si nous pensons au couple XML / XSLT dans le cadre d'une approche template, avec le support DOM XSLT, nous sommes globalement au même niveau qu'un Smarty ou qu'un Modelixe utilisés hors cache.
Ceci étant, l'approche XML / XSLT apparait comme plus séduisante, à mon avis. Ses avantages sont multiples sur de nombreux points. Nous parlons ici de technologies normalisées, documentées, indépendantes d'un eventuel langage complémentaire (ici PHP), etc. Bref, ce sont des standards, tout simplement.
Dès lors, dans le cadre d'une approche template, l'utilisation du couple XML / XSLT laisse vite un sentiment de satisfaction (au moins technique) : celui d'utiliser, sans réinventer la roue, deux technologies clairement adaptées à la problématique de séparation des traitements et des données. Ce sont même leurs raisons d'être !
Sablotron
Sablotron: Tutorial d'Olivier Meunier
Libxslt






Commentaires
#1 - Le vendredi 7 septembre 2007 à 11:47, par François
Ajouter un commentaire
Vous pouvez soumettre un commentaire en remplissant le formulaire ci-dessous. Toutes les contributions font l'objet d'une étape de modération par notre équipe.
Le code HTML dans le commentaire sera affiché comme du texte, les adresses internet seront converties automatiquement.