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 :

Exécution de logiciel externe et pipes


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    Points : 21
    Points
    21
    Par défaut Exécution de logiciel externe et pipes
    Bonjour à tous,

    j'ai actuellement un logiciel en java que j'exécute en ligne de commande sous unix.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java -jar LOGICIEL.jar < INPUTFILE > OUTPUTFILE
    J'ai besoin d'intégrer ce logiciel dans une page php afin de récupérer le contenu d'OUPUTFILE et de l'insérer dans une base de données.

    J'aimerai éviter de créer le fichier de sortie et récupérer directement son contenu grâce à un pipe pour le traiter dans le logiciel, mais j'avoue que j'ai du louper quelque chose car je n'ai aucun résultat.


    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
     92 $t = array(
     93         0=>array("pipe","r"),
     94         1=>array("pipe","w"),
     95         2=>array("pipe","a")
     96 );
     97
     98 echo "run the process<br/>";
     99
    100
    101 
    102
    103 $process = proc_open("java -jar LOGICIEL.jar < ".$seqs." > output.tsv",$t,$pipes);
    104
    105 echo "théoriquement le process run</br>";
    106 
    107 
    108 if(is_resource($process)){
    109         fclose($pipes[0]);
    110         echo "stdin fermé<br/>";
    111         
    112         while($s= fgets($pipes[1], 1024)){
    113                 echo $s."</br>";
    114         }
    115         fclose($pipes[1]);
    116         echo "stdout fermé<br/>";
    117         
    118         while($s = fgets($pipes[2], 1024)){
    119                 echo "error : ".$s."<br/>";
    120         }
    121         fclose($pipes[2]);
    122         echo "error fermé";
    123  }else echo "ca marche pas";
    124
    125
    126 $return = proc_close($process);
    127 echo $return;
    A l'affichage j'ai ceci :

    fichier seq :
    run the process
    théoriquement le process run
    stdin fermé
    stdout fermé
    error fermé127

    Ca n'est pas trop le résultat que j'attendais ( le contenu de output.tsv affiché)

    Est ce que quelqu'un peut m'aiguiller ?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Et si tu fais simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    proc_open("java -jar LOGICIEL.jar < ".$seqs, $output);
    echo $output;
    ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    Je m'excuse pour le délai de réponse, mais j'ai enchainé les réunions depuis mardi !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    131 proc_open("java -jar /scripts/comet/COMETstandalone.jar < ".$seqs,$output);
    132 echo $output;
    A fatal user error occurred at line 131 of file comet.php. The error message was Undefined variable: output
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    130 $output = array();
    131 proc_open("java -jar /scripts/comet/COMETstandalone.jar < ".$seqs,$output);
    132 echo $output;
    A fatal user error occurred at line 131 of file comet.php. The error message was proc_open() expects at least 3 parameters, 2 given
    Et si jamais la question était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    105 $output = "";
    106 $process = proc_open("java -jar /scripts/comet/COMETstandalone.jar < ".$seqs." > ".$output,$t,$pipes);
    107 var_dump($output);
    l'affichage donne : string '' (length=0)

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 304
    Points : 15 631
    Points
    15 631
    Par défaut
    essaye plutôt ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exec("java -jar /scripts/comet/COMETstandalone.jar < $seqs", $resultat);
    var_dump($resultat);

  5. #5
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    Exec fonctionne j'avais commencé par là, mais il me génère un fichier texte à ouvrir et à traiter, car c'est le comportement du programme java.

    Je veux justement intercepter cette création de fichier, pour récupérer directement les résultats sans qu'il ne crée le fichier texte, pour éviter de gérer les accès au fichier et sa suppression une fois le script terminé.

    De plus je suis obligée d'utiliser la syntaxe java -jar LOGICIEL.jar < input > output. Si je vire le output le java produit une erreur et ne s'exécute pas :/

  6. #6
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    De plus je suis obligée d'utiliser la syntaxe java -jar LOGICIEL.jar < input > output. Si je vire le output le java produit une erreur et ne s'exécute pas :/
    c'est le fonctionnement interne de ton logiciel qui impose ,pour son exécution, l'usage d'un fichier output pour écrire le résultat donc tu ne peux pas contourner cette obligation sauf d'aller modifier le code source de ce logiciel.

  7. #7
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    Bonjour

    Je ne peux pas le modifier il n'est pas de moi, mais l'informaticien qui l'a développé, quand je lui ai demandé une option pour un output autre que fichier, m'a dit d'utiliser des pipes flux et tout le toutim pour intercepter le résultat en php sans passer par la case fichier.

    Et je me retrouve ici du coup

  8. #8
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    si l'ouput est optionnel normalement le programme suivant devrait fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $flux = array(
              0=>array("pipe","r"),
              1=>array("pipe","w"), // Flux de sortie en écriture
              2=>array("pipe","a")
     );
     echo "run the process<br/>";
     $process = proc_open("java -jar LOGICIEL.jar < $seqs",$flux,$descripteurs);
             $fp = $descripteurs[1] ;
            while( $line = fgets($fp, 1024) ) {
                   echo htmlspecialchars($line),'<br>' ;
             }

  9. #9
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    J'ai finalement réussi à m'en sortir.

    C'était des petites choses qui n'étaient pas correctement configurées :
    - Le chemin vers le logiciel, proc_open ne voulait pas me prendre de chemin relatif.
    - le chemin du dossier initial de la commande, si je ne le renseigne pas en chemin absolu, rien à faire celà ne fonctionne pas.

    Donc voilà la version de test corrigée qui donne un résultat (pour info).

    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
    $command = "java -jar ".$_SERVER['DOCUMENT_ROOT']."/scripts/comet/COMETstandalone.jar";
    $cwd = $_SERVER['DOCUMENT_ROOT']."/scripts/comet";
     
    $descriptorSpec = array(0 => array("pipe", "r"),
                               1 => array('pipe', 'w'),
                               2 => array('pipe', 'w'));
      $process = proc_open($command, $descriptorSpec, $pipes,$cwd);
     
    if(is_resource($process)){
            fwrite($pipes[0],$seqs);
            fclose($pipes[0]);
            while($s= fgets($pipes[1], 1024)){
                    echo $s."</br>";
            }
            fclose($pipes[1]);
            while($s = fgets($pipes[2], 1024)){
                    echo "error : ".$s."<br/>";
            }
            fclose($pipes[2]);
     }else  echo "process error";

    J'hésite juste maintenant à utiliser la version trouvée ici http://omegadelta.net/2012/02/08/std...c_open-in-php/ qui permet de gérer de gros stdin.


    Merci à tous pour votre aide.

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

Discussions similaires

  1. Site en Intranet - Exécuter un logiciel externe
    Par frutix dans le forum Mon site
    Réponses: 5
    Dernier message: 25/08/2008, 10h30
  2. Exécuter un programme externe
    Par nourbane dans le forum ASP
    Réponses: 3
    Dernier message: 07/09/2006, 18h52
  3. Access et logiciel externe
    Par lolo_bob2 dans le forum VBA Access
    Réponses: 10
    Dernier message: 06/04/2006, 19h54
  4. [Exécution] Lancement logiciel avec fichier configuration
    Par Myogtha dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 26/01/2006, 13h58
  5. Comment exécuter un programme externe ?
    Par spikto dans le forum Langage
    Réponses: 12
    Dernier message: 27/06/2005, 16h18

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