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 :

proc_open blocage du processus par php


Sujet :

Langage PHP

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 proc_open blocage du processus par php
    Bonjour,

    J'utilise un script avec proc_open() afin de lancer un programme automatique d'édition vidéo.
    Je me suis inspiré texto du script du site php.net :

    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
    $descriptorspec = array(
       0 => array("pipe", "r"),  // // stdin est un pipe où le processus va lire
       1 => array("pipe", "w"),  // stdout est un pipe où le processus va écrire
       2 => array("file", "/tmp/error-output.txt", "a") // stderr est un fichier
    );
     
    $cwd = '/tmp';
    $env = array('quelques_options' => 'aeiou');
     
    $process = proc_open('php', $descriptorspec, $pipes, $cwd, $env);
     
    if (is_resource($process)) {
        // $pipes ressemble à :
        // 0 => fichier accessible en écriture, connecté à l'entrée standard du processus fils
        // 1 => fichier accessible en lecture, connecté à la sortie standard du processus fils
        // Toute erreur sera ajoutée au fichier /tmp/error-output.txt
     
        fwrite($pipes[0], '<?php print_r($_ENV); ?>');
        fclose($pipes[0]);
     
        echo stream_get_contents($pipes[1]);
        fclose($pipes[1]);
     
        // Il est important que vous fermiez les pipes avant d'appeler
        // proc_close afin d'éviter un verrouillage.
        $return_value = proc_close($process);
     
        echo "La commande a retourné $return_value\n";
    }

    Visiblement l'interaction entre php et les programmes lancés dans des processus n'est pas très facile à maîtriser.
    En effet la commande utilisée du type :
    "monlogiciel.exe [args] etc ..." renvoie en temps normal une sortie texte mise à jour en temps réel du genre "progression x%" indiquant la progression du programme.
    Or ceci visiblement pose problème à php puisque cette commande lancée par proc_open() finit par un blocage du script php au bout de 26 secondes obligeant à quitter ctrl+C. Ceci est bien lié au fonctionnement de php d'après mes tests puisque dans certains cas le processus arrive bien à son terme alors que le script php a été arrêté manuellement.
    Quelqu'un aurait il une idée pour éviter un blocage de php avec proc_open dans ce cas ou même une explication ?

  2. #2
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    salut

    Si ton PHP s'arrete sur le proc_open() en attendant l'execution du .exe ça me semble normal.
    tu fonctionnes en mode web ou en cli ?
    Quelle est la max execution time?

    merci

  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
    Bonjour,
    Je fonctionne en mode CLI.
    Ce qui se passe c'est que le processus s'arrête complètement à cause de php, car la fonction stream_get_contents() ne parvient pas à lire le flux et le processus se bloque.
    J'ai me semble-t-il un début d'explication :
    La commande utilisée lance un programme qui envoie du texte vers le stdout en temps réel (rafraîchissement fenêtre dos) c'est ça que php n'arrive pas à lire ou mal. En supprimant toute sortie du programme (message d'erreurs retour d'infos...) cette fois les fonctions proc_open() et stream_get_contents() ne bloquent plus le processus et celui-ci s'exécute jusqu'à la fin quelque soit sa durée.
    Donc à priori la solution trouvée pour l'instant c'est d'ajouter à la commande lorsque cela est possible l'argument du genre "-no_stdout_print" -no verbose..., mais on peut peut être faire mieux... ?

Discussions similaires

  1. [FLASH MX] photo par php
    Par guy2004 dans le forum Flash
    Réponses: 19
    Dernier message: 09/02/2005, 10h36
  2. Processus.. adoption d'un processus par init
    Par Francois Trazzi dans le forum Administration système
    Réponses: 15
    Dernier message: 17/01/2005, 14h56
  3. Réponses: 2
    Dernier message: 06/01/2005, 22h09
  4. [type MIME] css généré par php -> probleme
    Par prgasp77 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 23/09/2004, 22h13
  5. Blocage à 60 images par seconde
    Par houssa dans le forum OpenGL
    Réponses: 5
    Dernier message: 24/06/2003, 09h52

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