PHP 5.3 : Profiling XSLT

31 octobre 2008optimisation, php, php-5.3
 Cet article a été rédigé il y a plusieurs années et peut ne plus être tout à fait à jour…

Les exemples correspondant à ce point se trouvent dans le répertoire "xslt".

Pour ceux d'entre vous qui utilisent les fonctionnalités de transformation XSL fournies par PHP, PHP 5.3 comporte une nouveauté qui vous intéressera : le profiling lors de transformations XSL !

Prenons par exemple de fichier XML suivant (que j'ai honteusement recopié de la documentation PHP) :

<collection>
    <cd>
        <title>Fight for your mind</title>
        <artist>Ben Harper</artist>
        <year>1995</year>
    </cd>
    <cd>
        <title>Electric Ladyland</title>
        <artist>Jimi Hendrix</artist>
        <year>1997</year>
    </cd>
</collection>

Et l'exemple de feuille XSL correspondant (lui aussi recopié de la documentation -- mes notions de XSL sont plutôt vagues, et elles commencent à dater :-( ) :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="owner" select="'Nicolas Eliaszewicz'"/>
    <xsl:output method="html" encoding="iso-8859-1" indent="no"/>
    <xsl:template match="collection">
        Hey! Welcome to<xsl:value-of select="$owner"/>'s sweet CD collection!
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="cd">
        <h1>
            <xsl:value-of select="title"/>
        </h1>
        <h2>
            by<xsl:value-of select="artist"/>-<xsl:value-of select="year"/>
        </h2>
        <hr/>
    </xsl:template>
</xsl:stylesheet>

La transformation du document XML en code HTML à l'aide de la feuille XSL se fait de la manière suivante :

$doc = new DOMDocument();
$xsl = new XSLTProcessor();

$doc->load(__DIR__ . '/example-1.xsl');
$xsl->importStyleSheet($doc);

$doc->load(__DIR__ . '/example-1.xml');

$xsl->setProfiling('/tmp/profile.txt');

echo $xsl->transformToXML($doc);

En quelques mots :

  • Instanciation des objets DOMDocument et XSLTProcessor, permettant respectivement le travail avec des documents XML et leur transformation,
  • Chargement de la feuille de style,
  • Chargement du document XML,
  • Et enfin, transformation en HTML.

Il devient maintenant possible d'activer un profiler sur cette transformation, en utilisant la méthode setProfiling de la classe XSLTProcessor, qui prend en paramètre le chemin vers un fichier de sortie, au sein duquel seront enregistrées les informations de profiling :

$xsl->setProfiling('/tmp/profile.txt');

Cette méthode est, bien entendu, à appeler avant de lancer la transformation.

Une fois la transformation XSL effectuée, le fichier de profiling contiendra quelque chose de cette forme :

$ cat /tmp/profile.txt
number               match                name      mode  Calls Tot 100us Avg

    0           collection                                    1      8      8
    1                   cd                                    2      6      3

                         Total                                3     14

Ici, par exemple, nous avons traité une "collection", et deux "cd" -- ce qui correspond au contenu que nous avions dans notre fichier XML.
Et nous avons les temps d'exécution de la transformation pour chaque partie du document.

Voila qui aidera à améliorer les performances pour les transformations complexes de longs documents !