[PHP-JS] Script qui travaille dans le vide
Bonjour,
J'ai développé un script PHP qui lit un fichier xml et charge les données dans une base de données MySql.
Le script s'exécute correctement jusqu'à la fin, enregistre un log dans la base pour mémoriser l'heure de fin et le nombre de séjour enregistrés, mais à la fin il "tourne dans le vide" et je ne sais pas du tout ce qu'il fait ni de quoi ça vient. Le serveur httpd (Apache sous Linux) se met alors à consommer de la mémoire et des ressources CPU (jusqu'à 80%). Le navigateur continue à chager la page alors que le script est terminé.... 8O
J'ai essayé de fixer un max_execution_time ça ne change rien, j'ai aussi mis un exit à la fin du script mais il continue à "tourner". Les logs montrent que le script ne boucle pas puisqu'il ne recommence pas l'exécution complète du script (vidage base, chargement, mémorisation des logs en fur à mesure de l'exécution).
Pour info :
PHP 4.2.3
MySql 3.23.39
Voici la portion de code de chargement simplifié :
Code:
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
$filename = "nomxml.xml";
$tmpexecdeb=getmicrotime();
$tMo=floor(filesize($filename)/1048576);
$limite_basse=0; // limite minimum en Mo pour mettre à jour les flux
$nbsejinsert=0; // nb de séjours insérés
$nbvoyainsert=0; //nb de voyagistes insérés
/* On vide les tables séjours et voyagistes */
mysql_query("DELETE FROM lesvoyagistes");
mysql_query("DELETE FROM lessejours");
if ($tMo>=$limite_basse){
//echo "Limite Basse dépassée, début du parsage enclenché.<br>";
$contenuxml = implode("",file($filename));
$parser = xml_parser_create();
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
xml_parse_into_struct($parser,$contenuxml,$valeurs,$lesindex);
xml_parser_free($parser);
$nb=count($valeurs);
$count=0;
$messdebug=$nb. " tableaux de tags lus dans le fichier XML.";
$req_insert_log="INSERT INTO logs(log, dateheure) VALUES('$messdebug','".Date("Y-m-d H:i:s")."');";
$res=mysql_query($req_insert_log);
//foreach($valeurs as $tags){
for ($i=0; $i<$nb;$i++){
$tags=$valeurs[$i];
if ($tags['tag']=="tagexemple"){
/* Traitement du tag 'tagexemple' */
}
/* .... ICI traitement de tous les tags .... */
else if (($tags['tag']=='url') && ($tags['type']=='complete')) {
$url=$tags['value'];
$req_insert_voyagiste='ma requete insertion voyagiste';
mysql_query($req_insert_voyagiste);
$nbvoyainsert++;
}
else if (($tags['tag']=="voyagistes") && ($tags['type']=='open')) {
$req_insert_sejour='ma requete insertion sejour;';
mysql_query($req_insert_sejour);
$nbsejinsert++;
//echo $nbsejinsert." séjours insérés<br>";
}//fin si on commence à lire la liste des voyagistes
}//fin boucle sur les tags
}// fin si limite basse dépassée
$messdebug="Boucle des insertions terminée.";
$req_insert_log="INSERT INTO logs(log, dateheure) VALUES('$messdebug','".Date("Y-m-d H:i:s")."');";
$res=mysql_query($req_insert_log);
/* Contrôles de fin de procédure */
$tmpexec=getmicrotime()-$tmpexecdeb;
$min=floor($tmpexec/60);
$sec=floor($tmpexec-($min*60));
$speed=floor((filesize($filename)/1024)/$tmpexec);
$rapport_log="Taille du fichier : ".$tMo." Mo<br>";
$rapport_log.= $nbsejinsert . " séjours insérés.<br>";
$rapport_log.= $nbvoyainsert . " voyagistes insérés.<br>";
$rapport_log.= "Durée : " . $min . " min ".$sec." sec.<br>";
/* Enregistrement du log */
$req_insert_log="INSERT INTO logs(log, dateheure) VALUES('$rapport_log','".Date("Y-m-d H:i:s")."');";
$res=mysql_query($req_insert_log);
$messdebug="Enregistrement du log terminé.";
$req_insert_log="INSERT INTO logs(log, dateheure) VALUES('$messdebug','".Date("Y-m-d H:i:s")."');";
$res=mysql_query($req_insert_log); |
Si vous avez un idée... Merci beaucoup d'avance parceque là je ne vois vraiment plus dans quelle direction chercher...
Origine MySql ou Apache ?
Le script s'exécutant en entier, je pense qu'il s'agirait plutôt d'un problème de communication entre Apache et MySql ou un problème dans la config mais je vois pas où :oops:
A priori on pourrait penser que c'est le serveur de bdd qui reçoit trop de requêtes d'un coup mais c'est bien le serveur httpd donc Apache qui monte en CPU et en RAM. :cry:
Je précise aussi que la CPU et la RAM ne sont pas spécialement sollicitée pendant l'exécution du script (environ 6 minute pour lire 90 Mo de XML et faire 30 000 insertions), mais uniquement à la fin dès que tout est inséré et les logs envoyés à la base... donc quand je ne sais pas ce qu'il fait. :aie:
Peut-être qu'Apache attends quelque chose de MySql qui ne lui donne pas... J'ai farfouillé dans les logs d'Apache, je n'ai pas trouvé d'erreur significative....
Je commence à essayer de discéquer les logs de MySql et possibilités de mysqladmin pour localiser le problème...
Si quelqu'un a au moins une idée de comment localiser la source du problème...
Merci d'avance.