Si vous voulez exécuter une commande et obtenir les deux stderr
et stdout
, pas « fusionné », une solution serait probablement d'utiliser proc_open
, qui fournit un niveau de contrôle sur la commande qui est en cours d'exécution - y compris d'une manière à canaliser stdin
/stdout
/stderr
.
Et voici un exemple: nous allons considérer que nous avons ce script shell, dans test.sh
, qui écrit à la fois stderr
et stdout
:
#!/bin/bash
echo 'this is on stdout';
echo 'this is on stdout too';
echo 'this is on stderr' >&2;
echo 'this is on stderr too' >&2;
Maintenant, laissez le code de certains PHP, en temp.php
- Tout d'abord, nous initialisons les descripteurs i/o:
$descriptorspec = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "w"), // stderr
);
Et puis, exécutez la commande test.sh
, en utilisant les descripteurs, dans le répertoire courant et dire i/o devrait être de/à $pipes
:
$process = proc_open('./test.sh', $descriptorspec, $pipes, dirname(__FILE__), null);
Nous pouvons maintenant lire les deux tuyaux de sortie :
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
Et, si nous affichons le contenu de ces deux variables:
echo "stdout : \n";
var_dump($stdout);
echo "stderr :\n";
var_dump($stderr);
Nous obtenons la sortie suivante lors de l'exécution du script temp.php
:
$ php ./temp.php
stdout :
string(40) "this is on stdout
this is on stdout too
"
stderr :
string(40) "this is on stderr
this is on stderr too
"
Hope this helps :-)
Je vous recommande d'utiliser le composant Symfony/Process. –