Si vous souhaitez exécuter une commande, et d'obtenir à la fois stderr
et stdout
, pas "fusionné", une solution serait probablement d'utiliser proc_open
, ce qui offre un grand niveau de contrôle sur la commande qui est exécutée -- y compris un moyen de tuyau stdin
/stdout
/stderr
.
Et en voici un exemple : nous considérons que nous avons ce shell-script, en 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-nous le code PHP, en temp.php
-- d'abord, nous initialisons le i/o descripteurs :
$descriptorspec = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "w"), // stderr
);
Et, ensuite, exécutez l' test.sh
de commande, à l'aide de ces descripteurs, dans le répertoire courant, et disant: le i/o devrait être de/vers l' $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 avons sortie le contenu de ces deux variables :
echo "stdout : \n";
var_dump($stdout);
echo "stderr :\n";
var_dump($stderr);
Nous obtenons le résultat suivant lors de l'exécution de l' temp.php
script :
$ 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
"
Espérons que cela aide :-)