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

Langage PHP Discussion :

[PHP-JS] Script qui travaille dans le vide


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Par défaut [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é....

    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 : 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
    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...

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 28
    Par défaut
    Bonjour,

    Est-il possible de savoir de quelle manière ce script est appelé ?

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Par défaut Appel du script
    Je teste le script en l'appelant via le navigateur. J'ai fait un test d'exécution avec les crons du serveur en appelant le script automatiquement le matin avec un wget. Pour éviter une surchauffe j'avais utilisé l'option -timeout=1200. Le script tournant dans le vide, le cron relance le script (donc relance la commande wget sur le script). Dans ce cas, le script est relancé en continu jusqu'à ce que je le coupe manuellement. Par contre le CPU et la RAM ne semblent pas en souffrir...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Par défaut 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ù

    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.

    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.

    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.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Par défaut Version Apache
    Je précise qu'Apache est sous une vieille version 1.3.20

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 7
    Par défaut Test Local
    Bonjour,

    J'ai fait le test en local avec les même versions sauf Apache qui est un peu plus récent, Apache 1.3.24 au lieu de Apache 1.3.20 que je n'ai pas réussi à retrouver. En local tout fonctionne bien....

    Je suis ouvert à toute suggestion ou idée de tests à effectuer... Merci pour votre aide.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 09/09/2010, 02h53
  2. transfert d'un script qui est dans une iframe vers une autre page
    Par brunochp dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 10/03/2009, 16h14
  3. [PHP-JS] Script qui ne finit pas
    Par kabkab dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2007, 13h20
  4. script qui marche dans la console firebug mais pas a l'execution
    Par xclam dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/05/2007, 12h16
  5. [PHP-JS] Script qui me pose de grands problemes
    Par MadSoldier dans le forum Langage
    Réponses: 3
    Dernier message: 22/06/2006, 21h33

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