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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé 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
    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,

  2. #2
    Membre émérite

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    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....

  3. #3
    Membre éprouvé 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
    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 confirmé 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
    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.

  5. #5
    Membre émérite

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    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 !

  6. #6
    Membre confirmé 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
    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.

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