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

PHP & Base de données Discussion :

Récupérer les données sortantes avec proc_open


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 266
    Par défaut Récupérer les données sortantes avec proc_open
    Bonjour,
    J'ai créé un script php que j'exécute en ligne de commande me permettant d'avoir en sortie stdout des données binaires (image) :
    Commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php "mon_script.php" "ma_fonction" "mes_arguments"
    Dans mon programme j'ai testé cette ligne de commande avec les lignes de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $commande="php \"mon_script.php\" \"ma_fonction\" \"mes_arguments\";
    exec($commande,$retour,$statut);
    echo $retour;
    lorsque j'exécute en ligne de commande ou via le navigateur internet ces lignes de codes j'ai bien la variable $retour qui contient les données binaires (image).

    Par nécessité pratique, plutôt que d'utiliser exec(), j'utilise la fonction proc_open() en passant en paramètre la ligne de commande $commande. Cette méthode déjà utilisée sur d'autres lignes de commande ne retournant pas de données binaires fonctionne bien, mais dans le cas d'une commande retournant des données binaires (image) la fonction proc_open s'exécute mais le processus semble bloqué et aucune donnée n'est retourné par l'appel de stream_get_contents() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    proc_open($commande, $processus_tab[$index_processus]["liste_flux_entree_sortie"], $processus_tab[$index_processus]["ressources_flux"], $processus_tab[$index_processus]["dossier_entree"],$processus_tab[$index_processus]["variables_environnement"], $processus_tab[$index_processus]["options"] );
    .../...
    lecture des données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    		        $r = NULL;
    		        $w = array($processus_tab[$index_processus]["ressources_flux"][$option_tab["index_flux_sortie"]]); //flux de sortie du processus stdout
    		        $e = NULL;
    		        $c = stream_select($r, $w, $e, 0); 
    		    if($c!=0 && !$c){
     
     
    				foreach ($w as $stdout) {
    					$donnees=stream_get_contents($processus_tab[$index_processus]["ressources_flux"][$option_tab["index_flux_sortie"]]),"UTF-8","CP850");
    }
    .../...
    $statut_tab=proc_get_status($pocessus_en_question);
    La lecture de $statut_tab retourne le status "running=true" et la processus reste comme cela indéfiniment sans rien retourner alors que exec() retourne bien les données.

    Qu'est ce qui coince avec la fonction proc_open ? Merci d'avance.

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 266
    Par défaut
    Pour être parfaitement complet, la commande en question est un script php qui lui-même exécute une ligne de commande en résumé :

    mon script.php est un script qui contient ce type de code à exécuter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ob_start();
    passthru("ffmpeg_programme.exe arguments",$statut);
    $valeur_retour= ob_get_contents();
    fwrite(STDOUT,$valeur_retour);
    je lance donc le script.php avec la fonction proc_open() depuis le programme php principal et je tente de lire les données écrite sur pipe de sortie stdout comme décrit plus haut et là rien ne se passe je ne récupère aucune donnée alors qu'en passant par une commande passthru("php mon script.php",$stat) je récupère bien les données sur le stdout.

    Existe-t-il différents niveaux d'écriture sur le stdout ? Je ne comprend pas.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 266
    Par défaut
    Re bonjour,

    Voici la réponse après de nombreuses recherches, la vérification des flux avec stream_select() n'était pas bonne je l'ai remplacée par if($c!==0 && $c!==FALSE) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    		        $r = NULL;
    		        $w = array($processus_tab[$index_processus]["ressources_flux"][$option_tab["index_flux_sortie"]]);
    		        $e = NULL;
    		        $c = stream_select($r, $w, $e, 0); 
    		    if($c!==0 && $c!==FALSE){
    				//echo "flux stdout à lire".PHP_EOL;
     
    				foreach ($w as $stdout) {
     
    .../...}
    }

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/08/2009, 11h58
  2. Commande dos avec paramètres à partir d'excel
    Par tieumss dans le forum Access
    Réponses: 4
    Dernier message: 19/09/2006, 11h23
  3. [API][Système] Executer une commande dos avec arguments
    Par oOoOuuhmAn dans le forum Général Java
    Réponses: 4
    Dernier message: 17/03/2006, 12h37
  4. [Runtime]exec d'une commande DOS
    Par fidififouille dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 12/10/2005, 16h50
  5. Réponses: 3
    Dernier message: 22/10/2004, 12h04

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