Si desea ejecutar un comando, y obtener tanto stderr
y stdout
, no se "fusionaron", una solución, probablemente a utilizar proc_open
, que proporciona un gran nivel de control sobre el comando que está siendo ejecutado - incluyendo un modo a la tubería stdin
/stdout
/stderr
.
Y aquí es un ejemplo: Vamos a considerar tenemos este script de shell, en test.sh
, que escribe a la vez stderr
y 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;
Ahora, vamos código algo de PHP, en temp.php
- en primer lugar, inicializamos las E/S descriptores:
$descriptorspec = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "w"), // stderr
);
Y, a continuación, ejecutar el comando test.sh
, utilizando los descriptores, en el directorio actual, y diciendo que la E/S debe ser desde/hasta $pipes
:
$process = proc_open('./test.sh', $descriptorspec, $pipes, dirname(__FILE__), null);
Ahora podemos leer de los dos tubos de salida :
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
Y, si la salida del contenido de esas dos variables:
echo "stdout : \n";
var_dump($stdout);
echo "stderr :\n";
var_dump($stderr);
obtenemos el siguiente resultado cuando se ejecuta la secuencia de comandos 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
"
Esperanza esto ayuda :-)
Le recomendaré que use el componente Symfony/Process. –