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 ?