IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[XSLT] Processus de transformation PHP/XML/XSLT trés long


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre régulier Avatar de krapno
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 74
    Points
    74
    Par défaut [XSLT] Processus de transformation PHP/XML/XSLT trés long
    Bonjour,

    Le processus de transformation est particulièrement long, il faut plusieurs secondes (voir même des minutes) pour que PHP me retourne la page.

    L'environnement:
    - PHP 5.2.6 (même symptôme constaté avec PHP 5.1.42)
    - IIS 6.0 (php-cgi.exe - bug mémoire avec php5isapi.dll)
    - Windows 2003 Server (Bi-Xeons QuadCore + 4GO RAM)
    - RAID 5

    Je génère un arbre XML dynamiquement (données en provenance MySQL 5.1.42), rendu dans une variable de type STRING. L'arbre peut représenter plus de 400Ko enregistré en fichier texte.

    J'ai vérifié que la lenteur ne provient pas de MySQL, car sans transformation XSLT, mes pages PHP s'affichent rapidement, même pour des listes longues.

    Je recherche des solutions pour améliorer les performances de ce serveur dont les ressources ne semblent pas bien réparties

    Cordialement,
    Krapno

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Si ton code est parfaitement optimisé, tu n'as plus qu'à multiplier la fréquence de tes procs

    Donc regarde du côté de ton code d'abord ! Poste donc la fonction qui gère la transformation XSLT, et demande des suggestions d'améliorations.

    Et si ton code est bon et efficace, et bien tu devras te contenter de ces temps de réponse. Sauf si tu veux vraiment augmenter ta config matérielle qui semble tout à fait dans la norme. En soit une transformation XSL est un processus gourmand en CPU car tu dois bien souvent boucler plusieurs fois sur ton doc XML....
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  3. #3
    Membre habitué Avatar de Shinji62
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 135
    Points : 150
    Points
    150
    Par défaut
    Salut,
    Déjà passe en PHP 5.3 sera une première optimisation, en PHP 5.3.0 tu peux profiler tes exécutions XSLT ce qui te permettra surement d'optimiser ton code.

    Pour info :

    http://blog.pascal-martin.fr/post/ph...profiling-xslt

  4. #4
    Membre régulier Avatar de krapno
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 74
    Points
    74
    Par défaut
    Bonjour,

    Merci beaucoup pour vos réponses, et voici la portion de code qui exécute la fusion:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    (...)
    			$xml = new DOMDocument;
    			$xml->loadXML($xml_src); // A ce stade, $xml_src est une chaîne de caractères
    			$xsl = new DOMDocument;
     
    	#////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    	#///// CONTROL SUR EXISTENCE DU FICHIER D'HABILLAGE XSL /////////////////////////////////////////////////////////////////
     
    			$xsl_file = 'template/'.$web_id.'/'.$web_template_id.'/xsl/'.$sheet_xsl.'.xsl';
    			if (is_file(GetRootPath()."/".$xsl_file)) {
    				$xsl->load($xsl_file);
    			} else {
    				$xsl->load('template/'.$default_web_id.'/'.$default_web_template_id.'/xsl/'.$default_xsl.'.xsl');
    			}
     
    	#////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    	#///// FUSION DES DONNES XML ET DE L'HABILLAGE XSL //////////////////////////////////////////////////////////////////////
     
    			$proc = new XSLTProcessor;
    			$proc->importStyleSheet($xsl);
     
    	#////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    	#///// ACTIVATION DE FONCTIONS PHP //////////////////////////////////////////////////////////////////////////////////////
     
    			$proc->registerPHPFunctions($registeredPHPFunctions);
     
    	#////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    	#///// RESULTAT HTML  ///////////////////////////////////////////////////////////////////////////////////////////////////
     
    			$XMLXSL = $proc->transformToXML($xml);
     
    			#////////////////////////////////////////////////////////////////////////////////////////////////////////
    			#///// ACTUALISATION DU CACHE ///////////////////////////////////////////////////////////////////////////
     
    			if (
    				($default_cache_active == true)
    				and ($_SESSION["user_id"] == 0)
    				and ((!file_exists($CACHE_FILE_PATH)) OR (abs(@filemtime($CACHE_FILE_PATH) - time()) >= $CACHE_DELAY))
    			) {
    				$CACHE_FILE_HANDLER = fopen($CACHE_FILE_PATH, "w");
    				fwrite($CACHE_FILE_HANDLER, $XMLXSL);
    				fclose($CACHE_FILE_HANDLER);
    			}
     
    			//echo $XMLXSL;
    			echo $XMLXSL."\n<!-- COMPILED VERSION ".date("Y-m-d H:i:s")." -->";
    (...)
    Je pense passer en PHP 5.3.x ce soir.

    Sinon, j'ai ajouté en fin de script quantité de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mysql_free_result($monrésultat1);
    mysql_free_result($monrésultat2);
    (...)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    unset(
    	 $var1
    	,$var2
    	,$varN
    );
    (...)

    par souci d'optimisation mais je me trompe peut-être.
    Krapno

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Points : 872
    Points
    872
    Par défaut
    Tu disais dans ton premier post que c'est la transformation XSL qui prend du temps (d'après les tests que tu as faits) donc concentre toi plutôt là-dessus...

    Et ton souci ne vient probablement pas d'une mauvaise gestion mémoire mais d'un traitement lourd en CPU. Et au vu de ton code, ça semble propre et peu optimisable. Je pense tout simplement que ce traitement est lourd et c'est comme ça...

    Migre vers PHP 5.3 comme le suggère Shinji62 et tu verras bien.

    Ah si quand même ! Je ne sais pas si c'est le cas sur des transformations XSL, mais je sais que le parcours d'un fichier CSV est beaucoup plus rapide sous Linux que sous Windows... Tu devrais essayer !
    • Mon blog PHP : http://blog.alterphp.com
    • "Peace cannot be kept by force, it can only be achieved by Understanding" -- Albert Einstein

  6. #6
    Membre régulier Avatar de krapno
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 74
    Points
    74
    Par défaut
    Bonjour,

    Merci beaucoup de votre réponse.
    Une chose est sûr, je vais stopper le service et migrer PHP pour la dernière version dans la soirée, et je verrais bien.

    Dans mon code PHP, je génère donc mon arbre XML et le stocke dans une variable de type chaîne de caractère. J'ai déjà enregistré cette chaine dans un fichier et il peu peser plus de 400Ko, ce qui me semble quand même beaucoup pour un fichier texte. Il y a peut-être une variable à moduler dans le fichier PHP.ini pour que PHP utilise plus de RAM, j'en ai à revendre.

    NB: Pour mon site, je fais un echo du résultat de la fusion, je ne l'enregistre sous forme de fichier que dans ma procédure de cache.

    Après il y a aussi l'histoire d'utiliser php-cgi.exe ou php5isapi.dll, il me semble que php5isapi.dll est plus performant.
    Krapno

  7. #7
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    Pour la mémoire ds le php.ini, c'est cette directive : memory_limit = 128M

    Après il y a aussi les solutions de compilation php type bcompiler ou plus impressionnant comme Roadsend PCC mais je n'ai pas testé. Il y a un bon article dans le mensuel "PHP solutions".

  8. #8
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonsoir,

    Il faudrait également voir la transformation XSL que tu fais, il peut y avoir des améliorations à faire (sait-on jamais).

  9. #9
    Membre régulier Avatar de krapno
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 74
    Points
    74
    Par défaut
    Bonsoir,

    Voilà, j'ai passé mon serveur en PHP 5.3.1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Compiler 	MSVC9 (Visual C++ 2008) 
    Server API 	CGI/FastCGI
    J'ai passé le fichier php.ini au peigne fin et j'ai effectivement gagné en performance, c'est léger mais tout de même appréciable.

    J'ai eu quelques erreurs d'extension non chargées, je chercherez pourquoi demain mais peut-être que vous savez pourquoi (inclus ds php3?):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    php_exif.dll
    php_mssql.dll
    php_pdo_mssql.dll
    extension=php_zip.dll
    Je vais revoir mon système de cache interne, je pense que c'est là que je vais y gagner le plus.

    Pour répondre à ThomasR voici comment je commence mes XSL, cela peut peut-être aussi vous inspirer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet 
    	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    	xmlns:php="http://php.net/xsl"
    	version="2.0"
    	exclude-result-prefixes="php">
    <xsl:output
    	indent="yes"
    	method="xml" 
    	omit-xml-declaration="no"
    	encoding="utf-8"
    	doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
    	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" />
     
    (...)
     
    </xsl:stylesheet>
    Bonne soirée aux "couche-tard"!
    Krapno

  10. #10
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    L'entete XSL n'est surement pas la source de tes lenteurs. Il faut plutot regarder la transformation que tu appliques.

  11. #11
    Membre régulier Avatar de krapno
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 180
    Points : 74
    Points
    74
    Par défaut
    Bonjour,

    Pour les extensions j'ai trouvé l'origine du problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    php_mssql.dll
    php_pdo_mssql.dll
    extension=php_zip.dll
    font partie intégrante de PHP 5.3, donc pas de dll à charger.

    Pour php_exif.dll
    http://php.net/manual/en/exif.installation.php
    Windows users must enable both the php_mbstring.dll and php_exif.dll DLL's in php.ini. The php_mbstring.dll DLL must be loaded before the php_exif.dll DLL so adjust your php.ini accordingly.
    Ensuite je dois utiliser mysql_query() à la place de mysql_db_query() à plein d'endroits (en cours).

    Question à propos de l'en-tête XSL, si je reprends
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    	xmlns:php="http://php.net/xsl"
    dans TOUS mes xsl, est-ce que PHP effectue une requête HTTP à chaque fois? Si c'est le cas et que j'ai 50 include il va faire 1+50 requêtes et çà pourrait grandement ralentir les choses...

    Merci de votre analyse et bonne journée, j'ai quantité de mysql_db_query à transformer
    Krapno

  12. #12
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut
    Je pencherais aussi pour des problèmes dans ta transformation.
    A priori tu travailles en xslt 1 ce qui devrais être plus rapide que le le 2, en tout cas pour php.
    Tu ne fais bien qu'une seule transformation?
    Regarde si tu n'aurais pas trop de for-each et autre qui peuvent considérablement ralentir le travail.

    Pour tester le temps d'exécution hors de php, tu peut utiliser des outils comme Oxygen (version d'essai).

    Ce serait bien que tu poste ta xsl.
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

Discussions similaires

  1. [XSLT 1.0] Transformation fichier XML
    Par kirua2150 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 27/12/2016, 16h50
  2. [PHP][XML][XSLT]Utiliser PHP pour afficher mon xml
    Par bladebo dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 03/07/2007, 10h57
  3. [XSLT] php xml xslt extraction données
    Par Cyrille1969 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 26/04/2006, 23h23
  4. [DOM XML][XSLT] Création d'un document XML avec PHP
    Par ToxiZz dans le forum Bibliothèques et frameworks
    Réponses: 21
    Dernier message: 16/01/2006, 17h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo