Discussion:
system récupérer séparément stderr et stdout
(trop ancien pour répondre)
Une Bévue
2012-03-09 05:56:25 UTC
Permalink
depuis php j'utilise java pour une transfo xslt et j'aimerais, dans le
retour de ma commande java séparer stderr et stdout, est-ce possible en
php ?
pour l'instant j'utilise "bêtement", le plus simple, les guillemets
obliques :

return `$cmd`;
Olivier Miakinen
2012-03-09 08:03:34 UTC
Permalink
Bonjour,
Post by Une Bévue
depuis php j'utilise java pour une transfo xslt et j'aimerais, dans le
retour de ma commande java séparer stderr et stdout, est-ce possible en
php ?
Je ne l'ai jamais fait, mais en cherchant dans la doc j'ai trouvé trois
contributions d'utilisateurs qui pourraient t'intéresser :

http://fr.php.net/manual/fr/function.system.php#94929
http://fr.php.net/manual/fr/function.shell-exec.php#52826
http://fr.php.net/manual/fr/function.shell-exec.php#67183

Cordialement,
--
Olivier Miakinen
Une Bévue
2012-03-09 12:29:56 UTC
Permalink
Post by Olivier Miakinen
Je ne l'ai jamais fait, mais en cherchant dans la doc j'ai trouvé trois
http://fr.php.net/manual/fr/function.system.php#94929
http://fr.php.net/manual/fr/function.shell-exec.php#52826
http://fr.php.net/manual/fr/function.shell-exec.php#67183
Ouais, super, merci beaucoup.

en fait ils font comme en ruby, ils implemantes plusieurs pipes en r et
w...

je teste, et reposte un exemple simple...
Une Bévue
2012-03-09 12:35:03 UTC
Permalink
header('Content-Type: text/html; charset=utf-8');

function my_exec($cmd, $input=''){
$proc=proc_open($cmd, array(0=>array('pipe', 'r'),
1=>array('pipe', 'w'), 2=>array('pipe', 'w')), $pipes);
fwrite($pipes[0], $input);
fclose($pipes[0]);
$stdout=stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr=stream_get_contents($pipes[2]);
fclose($pipes[2]);
$rtn=proc_close($proc);
return array('stdout'=>$stdout, 'stderr'=>$stderr, 'return'=>$rtn);
}
$std_a= my_exec($cmd);
$stdouts=explode("\n", $std_a['stdout']);
foreach($stdouts as $stdout){
echo $stdout . '<br/>';
}
echo "stderr = " . $std_a['stderr'] . '<br/>';
echo "return = " . $std_a['return'] . '<br/>';

avec $cmd = 'ls -al' ça me donne :
total 19624
drwxr-xr-x 19 yt staff 646 Mar 9 13:15 .
drwxr-xr-x 18 yt staff 612 Mar 9 11:25 ..
-rw-r--r--@ 1 yt staff 6148 Mar 9 11:27 .DS_Store
-rwxr--r-- 1 yt staff 1422 Mar 9 11:15 AB2Html.rb
-rwxr--r-- 1 yt staff 5600 Mar 8 14:01 AB2Xml.rb

[... coupé par moi ...]

drwxr-xr-x 4 yt staff 136 Feb 8 19:51 vcards
-rw-r--r-- 1 yt staff 884 Mar 8 08:22 xsltsaxonproc.php

stderr =
return = 0


avec $cmd = 'totomod' (ie. une commande NON existante), ça me donne :

stderr = sh: totomod: command not found
return = 127

donc, c'est vraiment supeu, ça me donne le code de retour.

encore une fois merci beaucoup pour cette diligente réponse !

Loading...