Page 1 sur 1

Temps d'execution parsage XML

Posté : 27 avr. 2010, 15:12
par sylvaing26
Bonjour,
j'ai réalisé un script qui parse le flux XML d'un site qui m'envoi des données météo.
Hors je trouve que le temps du "parsage" est assez long à l'execution
$url = "http://www.meteorologic.net/webmaster/xml/xml_perso_881_849eac2b5cb8ad4a1e3fd597cb038c2a.xml";
$xml = file_get_contents($url);
$xml = domxml_open_mem($xml);
$xml = $xml->document_element();
$node_array = $xml->get_elements_by_tagname('date');
$node = $node_array[$i];        
$date = $node->get_content();
array_push($date_array,$date);
//////
$node_array = $xml->get_elements_by_tagname('description');
$node = $node_array[$i+2];        
$description = $node->get_content();
array_push($description_array,$description);
/////
}
$donnees_meteo = array_combine($date_array, $description_array);
$donnees_du_jour = $donnees_meteo[$date_meteo];
$donnees_du_jour = explode(" = ", $donnees_du_jour);
$temps = $donnees_du_jour[1];
$temps = explode(" ",$temps,2);
$temps = $temps[0];
$temperatures = $donnees_du_jour[2];
$temperatures = explode(" ",$temperatures,2);
$temperatures = $temperatures[0];
$direction = $donnees_du_jour[4];
$direction = explode(" ",$direction,2);
$direction = $direction[0];
$vent = $donnees_du_jour[3];
$vent = explode(" ",$vent,2);
$vent = $vent[0];
Ma question est celle ci : est ce que mon script gagnerai en vitesse d'execution si, avant que je parse le XML, j'en fait une copie sur mon serveur ?

Merci d'avance ;)

Re: Temps d'execution parsage XML

Posté : 27 avr. 2010, 15:17
par stealth35
hello, ca dépend si ton fichier est dynamique ou pas et si il est dynamique a quel fréquence il chance, le plus long souvent c'est le telechargement, tu pourrais faire une tache qui par exemple toute les heures retélécharge le fichier :wink:
après y'a d'autre optimisation que tu peu faire comme utilise xpath au lieu de faire un get_elements_by_tagname

Re: Temps d'execution parsage XML

Posté : 27 avr. 2010, 15:25
par sylvaing26
Salut,
et bien en fait il est généré toutes les 3h
Mon vrai code est celui ci (je stock dans une BDD entre 2 MAJ du XML)
Lorsque le XML est a jour (le temsp de chargement de la page dure 5s environ) par la suite, comme les nouvelles données sont dans la base, le temps de chargement de page est largement moins long
<?php
//// Fonction de recombinaison des tableaux
function array_combine($arr1,$arr2) {
	   $out = array();
	   	foreach ($arr1 as $key1 => $value1) {
	   	$out[$value1] = $arr2[$key1];	   
	   	}	   
	   	return $out;	

}
//// Fonction de direction du vent en fonction des degrés 	
function points_cardinaux($degres) {
switch($degres){
case $degres >= '337' AND $degres < '360' :
$point = 'N';
break;
case $degres >= '0' AND $degres < '22' :
$point = 'N';
break;
case $degres >= '22' AND $degres < '67' :
$point = 'NE';
break;
case $degres >= '67' AND $degres < '112' :
$point = 'E';
break;
case $degres >= '112' AND $degres < '157' :
$point = 'SE';
break;
case $degres >= '157' AND $degres < '202' :
$point = 'S';
break;
case $degres >= '202' AND $degres < '247' :
$point = 'SO';
break;
case $degres >= '247' AND $degres < '292' :
$point = 'O';
break;
case $degres >= '292' AND $degres < '337' :
$point = 'NO';
break;
}
return $point;
}
///// Fonction de jour ou de nuit
function jour_nuit($temps){
$heure_du_jour = date('H');
if($temps != "brouillard" AND $temps != "brouillardgivrant" AND $temps != "couvert" AND $temps != "neigefaible" AND $temps!="neifefaible" AND $temps != "neigeforte" AND $temps != "neigemoderer" AND $temps != "pluiefaible" AND $temps != "pluieforte" AND $temps != "pluiemoderer"){
  if($heure_du_jour >= '08' AND $heure_du_jour <= '21'){
  $jour_nuit = "jour_";
  }
  else{
  $jour_nuit = "nuit_";
  }
}
else {
$jour_nuit = "";
}
return $jour_nuit;
}
/////	Fonction pour la mise à jour
function  heure_maj($heure){
switch($heure){
case $heure > 02 AND $heure <= 05 :
$maj = 02 ;
break;
case $heure > 05 AND $heure <= 08 :
$maj = 05;
break;
case $heure > 08 AND $heure <= 11 :
$maj = 08;
break;
case $heure > 11 AND $heure <= 14 :
$maj = 11;
break;
case $heure > 14 AND $heure <= 17 :
$maj = 14;
break;
case $heure > 17 AND $heure <= 20 :
$maj = 17;
break;
case $heure > 20 AND $heure <= 23 :
$maj = 20;
break;
case $heure <= 02 : 
$maj = 23;
break;
}
return $maj;
}
//// Fonction pour la légende
function legende($temps){
switch($temps){
case "soleil" :
$legende = "Ciel dégagé";
break;
case "voile" :
$legende = "Ciel voilé";
break;
case "nuageux" :
$legende = "Ciel nuageux";
break;
case "couvert" :
$legende = "Ciel couvert";
break;
case "brouillard" :
$legende = "Brouillard";
break;
case "brouillardgivrant" :
$legende = "Brouillard givrant";
break;
case "neigefaible" :
$legende = "Neige faible";
break;
case "neifefaible" :
$legende = "Neige faible";
break;
case "neigemoderer" :
$legende = "Neige modérée";
break;
case "neigeforte" :
$legende = "Neige forte";
break;
case "pluiefaible" :
$legende = "Pluie faible";
break;
case "pluiemoderer" :
$legende = "Pluie modérée";
break;
case "verglas" :
$legende = "Verglas";
break;
case "averse" :
$legende = "Averses de pluie";
break;
case "averseneige" :
$legende = "Averses de neige";
break;
case "orageloc" :
$legende = "Orages locaux";
break;
case "oragefort" :
$legende = "Orages";
break;
}
return $legende;
}
////////

/////
//////
$date_jour = date('Ymd');
$heure = date('H');
switch($heure){
case $heure >= '00' AND $heure < '02' :
$heure_jour = '23';
$jour = date('d');
$mois = date('m');
$an = date('Y');
$date_jour = date('Ymd',mktime(1,0,0,$mois,$jour-1,$an));
break;
case $heure >= '02' AND $heure < '08' :
$heure_jour = '05';
break;
case $heure >= '08' AND $heure < '13' :
$heure_jour = '11';
break;
case $heure >= '13' AND $heure < '20' :
$heure_jour = '17';
break;
case $heure >= '20' AND $heure <= '23' :
$heure_jour = '23';
break;
}
$date_meteo = $date_jour.$heure_jour;
////////
include("../admin/include/acces/connect_sql.php");
MYSQL_CONNECT($serveur,$utilisateur_sql,$mdp_sql) or die ("Connexion impossible");
MYSQL_SELECT_DB($db) or die ("Connexion à la base de données $db impossible");
$sql_meteo = mysql_query("SELECT temps, temperature, direction, vent FROM meteo WHERE date=\"$date_meteo\"");
if(mysql_num_rows($sql_meteo) != 0){
//// actualisation des donnees
$sql_maj = mysql_query("SELECT contenu FROM donnees_diverses WHERE titre=\"maj_meteo\"");
while($result_maj=mysql_fetch_array($sql_maj)){
$dern_maj = $result_maj['contenu'];
}
$heure_pr_maj = date('H');
$heure_maj = heure_maj($heure_pr_maj);
$date_maj = date('Ymd').$heure_maj;
/// on met à jour
if($date_maj > $dern_maj){
$date_array = array();
$description_array = array();
for($i = 0; $i < 12; $i++){
$url = "http://www.meteorologic.net/webmaster/xml/xml_perso_881_849eac2b5cb8ad4a1e3fd597cb038c2a.xml";
$xml = file_get_contents($url);
$xml = domxml_open_mem($xml);
$xml = $xml->document_element();
$node_array = $xml->get_elements_by_tagname('date');
$node = $node_array[$i];        
$date = $node->get_content();
array_push($date_array,$date);
//////
$node_array = $xml->get_elements_by_tagname('description');
$node = $node_array[$i+2];        
$description = $node->get_content();
array_push($description_array,$description);
/////
}
$donnees_meteo = array_combine($date_array, $description_array);
$donnees_du_jour = $donnees_meteo[$date_meteo];
$donnees_du_jour = explode(" = ", $donnees_du_jour);
$temps = $donnees_du_jour[1];
$temps = explode(" ",$temps,2);
$temps = $temps[0];
$temperatures = $donnees_du_jour[2];
$temperatures = explode(" ",$temperatures,2);
$temperatures = $temperatures[0];
$direction = $donnees_du_jour[4];
$direction = explode(" ",$direction,2);
$direction = $direction[0];
$vent = $donnees_du_jour[3];
$vent = explode(" ",$vent,2);
$vent = $vent[0];
///  MAJ
include("../admin/include/acces/connect_sql.php");
MYSQL_CONNECT($serveur,$utilisateur_sql,$mdp_sql) or die ("Connexion impossible");
MYSQL_SELECT_DB($db) or die ("Connexion à la base de données $db impossible");
foreach ($donnees_meteo as $key => $val) {
$date_sql = mysql_real_escape_string($key);
$donnees_du_jour_sql = explode(" = ", $val);
$temps_sql = $donnees_du_jour_sql[1];
$temps_sql = explode(" ",$temps_sql,2);
$temps_sql = $temps_sql[0];
$temperatures_sql = $donnees_du_jour_sql[2];
$temperatures_sql = explode(" ",$temperatures_sql,2);
$temperatures_sql = $temperatures_sql[0];
$direction_sql = $donnees_du_jour_sql[4];
$direction_sql = explode(" ",$direction_sql,2);
$direction_sql = $direction_sql[0];
$vent_sql = $donnees_du_jour_sql[3];
$vent_sql = explode(" ",$vent_sql,2);
$vent_sql = $vent_sql[0];
mysql_query("UPDATE meteo SET temps=\"$temps_sql\", temperature=\"$temperatures_sql\", direction=\"$direction_sql\", vent=\"$vent_sql\" WHERE date=\"$date_sql\" LIMIT 1");
}
mysql_query("UPDATE donnees_diverses SET contenu=\"$date_maj\" WHERE titre=\"maj_meteo\" LIMIT 1");

}
/////
while($result_meteo=mysql_fetch_array($sql_meteo)){
$temps = stripslashes($result_meteo['temps']);
$temperatures = stripslashes($result_meteo['temperature']);
$direction = stripslashes($result_meteo['direction']);
$vent = stripslashes($result_meteo['vent']);
}
}
///////////
else {
$date_array = array();
$description_array = array();
for($i = 0; $i < 12; $i++){
$url = "http://www.meteorologic.net/webmaster/xml/xml_perso_881_849eac2b5cb8ad4a1e3fd597cb038c2a.xml";
$xml = file_get_contents($url);
$xml = domxml_open_mem($xml);
$xml = $xml->document_element();
$node_array = $xml->get_elements_by_tagname('date');
$node = $node_array[$i];        
$date = $node->get_content();
array_push($date_array,$date);
//////
$node_array = $xml->get_elements_by_tagname('description');
$node = $node_array[$i+2];        
$description = $node->get_content();
array_push($description_array,$description);
/////
}
$donnees_meteo = array_combine($date_array, $description_array);
$donnees_du_jour = $donnees_meteo[$date_meteo];
$donnees_du_jour = explode(" = ", $donnees_du_jour);
$temps = $donnees_du_jour[1];
$temps = explode(" ",$temps,2);
$temps = $temps[0];
$temperatures = $donnees_du_jour[2];
$temperatures = explode(" ",$temperatures,2);
$temperatures = $temperatures[0];
$direction = $donnees_du_jour[4];
$direction = explode(" ",$direction,2);
$direction = $direction[0];
$vent = $donnees_du_jour[3];
$vent = explode(" ",$vent,2);
$vent = $vent[0];
/// insertion de la météo dans la base de donnees
include("../admin/include/acces/connect_sql.php");
MYSQL_CONNECT($serveur,$utilisateur_sql,$mdp_sql) or die ("Connexion impossible");
MYSQL_SELECT_DB($db) or die ("Connexion à la base de données $db impossible");
mysql_query("TRUNCATE meteo");
foreach ($donnees_meteo as $key => $val) {
$date_sql = mysql_real_escape_string($key);
$donnees_du_jour_sql = explode(" = ", $val);
$temps_sql = $donnees_du_jour_sql[1];
$temps_sql = explode(" ",$temps_sql,2);
$temps_sql = $temps_sql[0];
$temperatures_sql = $donnees_du_jour_sql[2];
$temperatures_sql = explode(" ",$temperatures_sql,2);
$temperatures_sql = $temperatures_sql[0];
$direction_sql = $donnees_du_jour_sql[4];
$direction_sql = explode(" ",$direction_sql,2);
$direction_sql = $direction_sql[0];
$vent_sql = $donnees_du_jour_sql[3];
$vent_sql = explode(" ",$vent_sql,2);
$vent_sql = $vent_sql[0];
mysql_query("INSERT INTO meteo VALUES ('', '$date_sql', '$temps_sql', '$temperatures_sql', '$direction_sql', '$vent_sql')");
}
$heure_pr_maj = date('H');
$heure_maj = heure_maj($heure_pr_maj);
$date_maj = date('Ymd').$heure_maj;
mysql_query("UPDATE donnees_diverses SET contenu=\"$date_maj\" WHERE titre=\"maj_meteo\" LIMIT 1");
}
////
?>
<!-- Méteo -->
<style>
<!--
a.info{
position:relative;
z-index:99;
text-decoration:none;
color:black;
}
 
a.info:hover{
z-index:100;
color:black;
}
 
a.info span{
display: none;
color:black;
}
 
a.info:hover span{
display:block;
position:absolute;
top:2em; left:2em;
border:1px solid #000000;
background-color:#FFFFCC;
color:#000000;
text-align: left;
font-weight:none;
font-family:Arial;
font-size:8pt;
padding:3px;
color:black;
}
-->
</style>
<table cellpadding="0" cellspacing="0" style="cursor:pointer; margin-top:0px; margin-bottom:0px;" onclick="document.location.href='meteo.php';">
    <tr>
        <td style="padding-right:10px;">
            <p style="margin-top:0px; margin-bottom:0px;" align="center"><a class="info" href="#"><img src="../meteo/pictos/<?php
echo jour_nuit($temps);
echo $temps; 
            ?>.gif" width="25" height="25" border="0" align="absmiddle"><span><NOBR><?php echo legende($temps) ?></NOBR></span></a></p>
        </td>
        <td style="padding-right:10px;"><a class="info" href="#"><img align="absmiddle" src="../meteo/pictos/temperature.gif" width="9" height="25" border="0" style="margin-right:2px;"><span><NOBR>Température : <?php echo round($temperatures); ?>°C</NOBR></span></a><font face="Arial"><span style="font-size:8pt;"><a class="info" href="#"><b><?php
            echo round($temperatures); 
            ?>°C</b><span><NOBR>Température : <?php echo round($temperatures); ?>°C</NOBR></span></a></span></font></td>
        <td style="padding-right:5px;"><a class="info" href="#"><img align="absmiddle" src="../meteo/pictos/vent.gif" width="21" height="25" border="0"><span><NOBR>Direction : <?php echo points_cardinaux($direction); ?></NOBR><BR /><NOBR>Vitesse : <?php echo round($vent); ?>Km/h</NOBR></span></a></td>
        
        <td><font face="Arial"><span style="font-size:8pt;"><a class="info" href="#"><b><?php
            echo points_cardinaux($direction); 
            ?></b><br /><?php
            echo round($vent); 
            ?> km/h<span><NOBR>Direction : <?php echo points_cardinaux($direction); ?></NOBR><BR /><NOBR>Vitesse : <?php echo round($vent); ?>Km/h</NOBR></span></a></span></font></td>
    </tr>
</table>
<!-- Fin Méteo -->

Re: Temps d'execution parsage XML

Posté : 27 avr. 2010, 15:29
par stealth35
ouais ne même temps y'a pas mal d'optimisation a faire, quelle est la version de PHP de ton serveur ?

Re: Temps d'execution parsage XML

Posté : 27 avr. 2010, 15:33
par sylvaing26
PHP 4

Re: Temps d'execution parsage XML

Posté : 27 avr. 2010, 15:34
par stealth35
PHP 4
arf t'es chez free ? sinon php 4 mais quel version ?

Re: Temps d'execution parsage XML

Posté : 27 avr. 2010, 15:36
par sylvaing26
Non chez 1&1
PHP v 4.4.9

Re: Temps d'execution parsage XML

Posté : 27 avr. 2010, 15:39
par stealth35
Non chez 1&1
PHP v 4.4.9

je t'annonce avec joie que tu va pouvoir migrer sous PHP5
http://faq.1and1.fr/scripts/php/5.html

:wink:

ta le schémas de ta base de donnée ?

Re: Temps d'execution parsage XML

Posté : 27 avr. 2010, 15:40
par sylvaing26
Le problème c'est que tout le site est développé pr PHP 4 ...
Faut que je me retape tout à coder pr optimiser sur php5 sinon ... donc c'est pr ca que pr parser le XML j'ai fait comme ca, de même que j'ai créé une fonction pr combiner les tableaux ...

Re: Temps d'execution parsage XML

Posté : 27 avr. 2010, 15:45
par stealth35
Le problème c'est que tout le site est développé pr PHP 4 ...
Faut que je me retape tout à coder pr optimiser sur php5 sinon ... donc c'est pr ca que pr parser le XML j'ai fait comme ca, de même que j'ai créé une fonction pr combiner les tableaux ...
on va y allé en douceur, et t'inquete pas pour array_combine elle existe en php5

deja :
- pas besion de connecter 2 fois a ta base mysql une seule connexion suffis
- je sais pas si ta remarque mais quand tu fais ton file_get_contents (ligne 187 et 254) tu le fais dans ta boucle ton fichier va se charger 12 fois

dans le fond a par pour l'extension DOM tu va pas avoir grand chose a changer, pour faire des tester tu peu simplement te creer un nouveau ficher en .php5 :wink:

Re: Temps d'execution parsage XML

Posté : 27 avr. 2010, 15:47
par sylvaing26
Le problème du chargement qui se fait 12 fois peut surement expliquer le temsp de chargement qui est long ...

Re: Temps d'execution parsage XML

Posté : 27 avr. 2010, 15:49
par stealth35
Le problème du chargement qui se fait 12 fois peut surement expliquer le temsp de chargement qui est long ...
ouai en plus tu le fait 2 fois, suffis juste en haut de ton fichier de faire juste
$url = file_get_content(..............);
après ca reste dans $url de tout façon, en plus ducoup je vois pas trop a quoi sert la boucle ?

Re: Temps d'execution parsage XML

Posté : 27 avr. 2010, 15:52
par sylvaing26
j'ai modifié la portion de code
$url = "http://www.meteorologic.net/webmaster/xml/xml_perso_881_849eac2b5cb8ad4a1e3fd597cb038c2a.xml";
$xml = file_get_contents($url);
$xml = domxml_open_mem($xml);
$xml = $xml->document_element();
$node_array = $xml->get_elements_by_tagname('date');
for($i = 0; $i < 12; $i++){
$node = $node_array[$i];        
$date = $node->get_content();
array_push($date_array,$date);
//////
$node_array = $xml->get_elements_by_tagname('description');
$node = $node_array[$i+2];        
$description = $node->get_content();
array_push($description_array,$description);
/////
}
La boucle sert à faire un tableau avec le contenu des items <date> et <description>

Re: Temps d'execution parsage XML

Posté : 27 avr. 2010, 15:58
par stealth35
je vois, pour ca ca serais mieux d'utiliser foreach
d'ailleur tu devrais pas mettre ton $xml->get_elements_by_tagname('description'); dans ta boucle, enfin y'a un truc bizarre ici, sinon array_push c'est pas très optimiser quand tu veux insérer 1 valeur utilise juste les croches vide
$node_array = $xml->get_elements_by_tagname('date');
	
foreach($node_array as $node)
{  
	$date = $node->get_content();
	$date_array[] = $date;	
}

Re: Temps d'execution parsage XML

Posté : 27 avr. 2010, 16:00
par sylvaing26
D'acc je te remercie, je vais optimiser tout ca ;)
Deja avec ce que tu m'as donné comme info le temps de chargement est largement moins long !