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

Shell et commandes GNU Discussion :

lancer(parcer) plusieurs fichiers en même temps


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut lancer(parcer) plusieurs fichiers en même temps
    Bonjour
    je veux parser 4 fichiers xml en même temps et stoker le résultat dans la base de données.
    php seul ne permet pas ça, vu qu'il ne commence l'exécution du 2ème fichier que lorsqu'il finisse avec le premier.

    j'ai essayé la commande exec comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $array1=$array2=$array3=$array4=array();
    $a=$b=$c=$d=0;
    exec("/usr/local/bin/php feed1.php",$array1,$a);
    exec("/usr/local/bin/php feed2.php",$array2,$b);
    exec("/usr/local/bin/php feed3.php",$array3,$c);
    exec("/usr/local/bin/php feed4.php",$array4,$d);
    mais toujours le même résultat (instruction par instruction).

    j'ai entendu parlé de la commande "fork" mais je ne sais pas comment l'utiliser et si ça va résoudre le problème.

    le suis sur un serveur linux.

    si vous avez des solutions avec shell, php, perl, paython ou autre je suis preneur

    Merci d'avance

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    frok
    9a c'est le pantalon , bien qu'il puisse aussi être multi tache


    fork est bien le terme pour créer des process fils, donc du "multi tache" (ou creer du multi thread, mais c'est un autre debat)

    mais le fork ne s'utilise pas d ela façon dont tu a essayé ....
    http://php.net/manual/fr/function.pcntl-fork.php

    et le forum php pour plus d'explication.
    Marc
    Slackware for ever ......
    BASH - KSH ( http://marcg.developpez.com/ksh/ )

  3. #3
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Il y'a tout ce qu'il te faut avec un shell de base.

    lancer un process en tache de fond '&' à la fin de la commande
    Récupérer le PID de la dernière commande lancé $!
    Attendre la fin de l'exécution d'un process avec wait.


    exemple si tu as deux programme un client et un serveur avec lesquel tu souhite faire un test basique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    monServeurDeTest &
    pid1=$!
     
    monClientDeTest &
    pid2=$!
     
    wait $pid1 $pid2 
     
    ...
    les autres langage que tu cite le permettent aussi.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  4. #4
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    tu peux aussi utiliser jobs pour faire une attente plus active et voir l'état des différents processus....

    ici avec la commande sleep (au lieu d'une vrai commande à executer).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    sleep 10 &
    sleep 20 &
    sleep 30 &
    sleep 40 &
     
    jobs | grep Running >/dev/null
    status=$?
    while [[ "$status" -eq "0" ]]
      sleep 1
      echo "--"
      jobs | grep Running 
      status=$?
    done
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  5. #5
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    Merci les amis pour vos réponses:
    M jabbounet:
    pour le shell je ne sais pas comment je dois procéder.
    est ce que je dois mettre le bout de code dans la la fonction exec()?
    M MarcG:
    et pour la fonction pcntl_fork() de php je ne sais pas vraiment comment l'exploiter dans mon cas, j'ai consulté la documentation mais j'ai pas trop compris
    son fonctionnement.

    je suis toujours entrain de rechercher comment l'utiliser

  6. #6
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    plutôt quelque chose du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /usr/local/bin/php feed1.php <les arguments> &
    ou <les arguments> représentent les argument de ton script s'il y'en a.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  7. #7
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    bonjour
    j'ai presque trouvé la solution.
    j'utilise pcntl_fork()

    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
     
    $pid = pcntl_fork();
    if($pid==0) 
    {
    	$pid2 = pcntl_fork();
    	if($pid2==0) 
    	{
    		$pid3 = pcntl_fork();
    		if($pid3==0) 
    		{
    			for($i=0;$i<10;$i++)
    			{
    				mysql_query("insert into `#table` (value) values ('PID du 4ème fils: $pid3')");
    			}
    		}
    		else 
    		{
    			for($j=0;$j<10;$j++)
    			{
    					mysql_query("insert into `#table` (value) values ('PID du 3ème fils: $pid3')");
    			}
    		}
    	}
    	else 
    	{
    		for($k=0;$k<10;$k++)
    		{
    			mysql_query("insert into `#table` (value) values ('PID du 2ème fils: $pid2')");
    		}
    	}
     
    }
    else
    {
    	for($l=0;$l<10;$l++)
    	{
    		mysql_query("insert into `#table` (value) values ('PID du père: $pid')");
    	}
    }
    ce bout de code cree 4 processus qui font 10 insertion dans la base de données.

    lorsque je parcourt la table je trouve que les insertions se passe en parallèle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1  	PID du 4ème fils: 0
    2 	PID du 3ème fils: 26475
    3 	PID du 2ème fils: 26474
    4 	PID du père: 26473
    donc les processus marche en même temps.

    le problème qui reste c'est que les processus ne terminent pas l'insertion.
    il doit y avoir 40 insertions, et je trouve toujours moins (15 20-25).
    je crois il y'a quelque chose qui interrompe l'exécution des processus

  8. #8
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    De ce que je comprend de la fonction fork en php si tu connais le pid tu es dans le processus père et non dans le fils.

    Ensuite avant de poursuivre les traitement (ou terminer le père si c'est la fin), il faut attendre la fin des processus fils avec wait ou waitpid.

    je ne connais pas php, jamais pratiqué, mais dans l'esprit je verrais un truc dans ce style:
    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
     
    for (i=0;i<3;i++) {
      $pid[i] = pcntl_fork();
      if($pid[i]==0) { 
         // on est dans le fils, insertion de données dans la table
        for($j=0;$j<10;$j++) {
          mysql_query(" ..... ");
        }
      } else {
        // on est dans le père on indique que le fils à été lancé,
        // et on passe au lancement suivant, insérer un wait dans cette 
        // boucle reviendrais a séquentialiser les traitements.
        print('fils $i avec le pid $pid[i] lancé');
      }
     }
    }
    // Attente de la fin des processus fils.
    for(i=0; i< 3 ; i++) {
      if ($pid[i] != 0) {
        // le père a le tableau de pid rempli.
        print("attente de la fin du processus $pid[i]")
        pcntl_waitpid($pid[i], .....);
      }
     }
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  9. #9
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    le problème qui reste c'est que les processus ne terminent pas l'insertion.
    il doit y avoir 40 insertions, et je trouve toujours moins (15 20-25).
    je crois il y'a quelque chose qui interrompe l'exécution des processus
    je crois que c'est la configuration du serveur qui ne permettait pas ça
    (Hébergement mutualisé).

    j'ai essayé le script ailleurs et ça marche.

    Merci pour votre aide

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

Discussions similaires

  1. [XL-2003] Difficultés à ouvrir plusieurs fichiers en mêmes temps
    Par anfernus dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/07/2010, 13h53
  2. Réponses: 15
    Dernier message: 24/11/2008, 16h16
  3. Réponses: 38
    Dernier message: 26/09/2008, 17h46
  4. Ouverture de plusieurs fichiers en même temps ?
    Par nicolas.sitbon dans le forum POSIX
    Réponses: 42
    Dernier message: 07/08/2008, 23h35
  5. ouvrir plusieurs fichiers en même temps
    Par diiity dans le forum Windows
    Réponses: 0
    Dernier message: 03/08/2007, 18h26

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