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 :

[DOM][SimpleXML] Performances ?


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 17
    Points : 9
    Points
    9
    Par défaut [DOM][SimpleXML] Performances ?
    Bonjour,

    j'essaie de parser de manière très basique un fichier XML, et j'obtiens des performances catastrophiques (dans les 5 secondes pour traiter un fichier qui met moins de 0,1 secondes pour être parsé de la même manière en excel vba, la honte...).

    Les deux approches sonts ci dessous, elles sont toutes les deux aussi lentes. Auriez vous des idées pour accélerer les traitements ?

    Variante DOM :
    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
     
    function parserListeValeursXML($urlfichier,$nom_champ) {
    	//objets et variables
    	$tableauRetour = array();
    	$index = 0;
     
    	//chargement
    	$dom = DOMDocument::load($urlfichier);
    	if(!$dom) die('Erreur lecture fichier XML');
    	$racine=$dom->getElementsByTagName('Liste_valeurs')->item(0);
    	$listeEnregistrements = $dom->getElementsByTagName('enregistrement');
     
    	//parcours des objets
    	if (count($listeEnregistrements) > 0) {
    		foreach ($listeEnregistrements as $enregistrement) {
    			$tableauRetour[$index] = $enregistrement->nodeValue;
    			$index = $index + 1 ;
    		}
    		return($tableauRetour);
    	} else {
    		return(false);
    	}
    }
    Variante SimpleXML :
    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
     
    function parserListeValeursXML($urlfichier,$nom_champ) {
    	//objets et variables
    	$tableauRetour = array();
    	$index = 0;
     
    	//lecture et chargement chargement
    	$handle = fopen($urlfichier,'r');
    	$xmlbrut = '';  
    	while (!feof($handle)) {  
    		$xmlbrut .= fread($handle, 1024);  
    	}  
    	fclose($handle);	
    	$xml=simplexml_load_string($xmlbrut);
    	if(!$xml) die('Erreur lecture fichier XML');
     
    	//parcours des objets
    	foreach ($xml->enregistrement as $item) {
    		$tableauRetour[$index] = $item->$nom_champ;
    		$index = $index + 1 ;
    	}
    	return($tableauRetour);
    }

    Mille Mercis !

  2. #2
    Invité
    Invité(e)
    Par défaut


    C'est étonnant cette histoire de perf...
    • Quelle est la taille de ton fichier ? La profondeur max de l'arbre XML ?
    • Quel est ton OS ? Ta version de PHP ?
    • De quelle manière accèdes-tu au fichier ? Si c'est via HTTP, as-tu vérifié que ce n'est pas simplement le download qui est très lent ?

  3. #3
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Qu'un traitement php soit plus long cela peut se concevoir mais je serais prêt à parier que la troisième proposition de David Guillot est la bonne... pour que le traitement seul dure cinq secondes il faudrait que le fichier soit énorme et si ce n'est pas le cas cela ne peut être qu'un problème de temps de chargement du fichier.

  4. #4
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Le fichier fait dans les 3ko, profondeur sur 2 niveaux.

    Comme tout est en localhost pour l'instant, sur une machine relativement récente, je pars sur l'hypothèse que ce n'est pas un problème de téléchargement.

    Remarque : ni le CPU ni la conso de mémoire ne s'affolent pendant le traitement, c'est plutôt l'encéphalogramme plat...

  5. #5
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    étrange...
    SimpleXml est bâti sur DOMDocument donc c'est kif-kif.
    Pour en avoir le coeur net pose des timers autour de $dom = DOMDocument::load($urlfichier); et poste le temps de chargement.

  6. #6
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Voila : 6 secondes pour le DOMDocument::load

    Pour info le fichier parsé fait dans les 1,5ko et comprends 21 champs comme ci dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     <?xml version="1.0" encoding="ISO-8859-1" ?> 
    <Liste_valeurs nbEnregistrements="21">
    <enregistrement>
      <Societe> tagada</Societe>
    </enregistrement>
    ...

  7. #7
    Invité
    Invité(e)
    Par défaut
    [troll]T'es sous Windows ou quoi ?[/troll]

    Plus sérieusement, je te repose la même question : quel OS ? quelle version de PHP ?

    Et même pour être plus précis : comment est attaqué PHP (CLI ? Derrière Apache via FPM ? Derrière Apache monté en module ? Derrière Apache monté en CGI ?)

  8. #8
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Aïe, je suis démasqué...

    Donc oui, sous XP (et je n'y suis pour rien, désolé ), avec l'installation par défaut de XAMPP 3.1.0.
    - PHP 5.4.7
    - pour la manière dont est attaqué php, j'ai peur de répondre une annerie...

  9. #9
    Invité
    Invité(e)
    Par défaut
    Sur XAMPP, PHP est monté en module Apache, mais là ne sera pas le problème...

    T'aurais pas possibilité de tester dans un autre environnement, genre sur un OS qui sait ce que c'est le XML ? Parce que la librairie MSXML, selon les versions, ça pouvait être un vrai drame...

  10. #10
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Services de proximité

    Informations forums :
    Inscription : Février 2013
    Messages : 27
    Points : 56
    Points
    56
    Par défaut
    J'ai eu une fois un problème de performances que je ne comprenais pas et quand je changeais le chemin du fichier de "localhost" à "127.0.0.1" le problème de performance disparaissait ...
    Le test ne coute pas grand chose à faire en tout les cas.

  11. #11
    Futur Membre du Club
    Inscrit en
    Février 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Alors je ne suis pas sur d'avoir tout compris, mais il me semble être arrivé à quelque chose (et ce n'est déjà pas mal) en écumant les forums.

    Il semblerait que DOMDocument::load attende une fermeture de session TCP pour considérer que la réception du fichier est terminée, ce que le serveur n'envoie pas par défaut, d'où l'attente d'un time out.

    Ceci peut être contourné en téléchargeant l'XML avec une requête HTTP demandant la fermeture de session pour le parser après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $context = stream_context_create(array('http' => array('header'=>'Connection: close\r\n')));
    $chainexml = file_get_contents($urlfichier,false,$context);
    Puis de l'ouvrir avec DOMDocument::loadXML

    D'où temps de réponse passe de 6 secondes à ~0 sec, ce qui est plus raisonnable pour un pauvre fichier de 1,5ko...

  12. #12
    Invité
    Invité(e)
    Par défaut
    C'était bien la requête HTTP qui posait problème et pas l'interprétation du XML... La bonne pratique serait peut-être d'utiliser cURL pour récupérer le contenu en HTTP et de charger ensuite ce contenu dans le DOM via loadXML()...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SimpleXML] Copier un noeud pour le renommer, problème format DOM -> SimpleXML
    Par phoenix420 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 15/08/2013, 18h36
  2. [XML] impossible d'utiliser dom,simplexml,domxml en local
    Par gilbertbicot dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 26/02/2009, 10h12
  3. [XML] [EXPAT/DOM/SimpleXML/SAX] Que faire ?
    Par titoff85 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 10/08/2007, 09h25
  4. Performances SimpleXML / MySQL
    Par Benji76 dans le forum Langage
    Réponses: 1
    Dernier message: 11/01/2007, 22h29
  5. [SimpleXML] [DOM] Ajouter un attribut
    Par Klimium dans le forum Bibliothèques et frameworks
    Réponses: 45
    Dernier message: 14/12/2006, 12h56

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