Jeśli chcesz wykonać polecenie i uzyskać zarówno stderr
i stdout
, a nie „połączone”, rozwiązanie byłoby prawdopodobnie używać proc_open
, która zapewnia dużą poziom kontroli nad poleceniem że to jest wykonywane - w tym sposób do rury stdin
/stdout
/stderr
.
A oto przykład: rozważmy mamy ten skrypt powłoki, w test.sh
, który pisze zarówno stderr
i 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;
Teraz Kod trochę PHP, w temp.php
- po pierwsze, że inicjalizacja deskryptorów I/o:
$descriptorspec = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "w"), // stderr
);
A zatem wykonać polecenie z test.sh
, stosując te wskaźniki, w bieżącym katalogu, a mówiąc I/O powinny być z/do $pipes
:
$process = proc_open('./test.sh', $descriptorspec, $pipes, dirname(__FILE__), null);
Teraz możemy odczytać z dwóch rur wyjściowych :
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
A jeśli mamy wyjście treść tych dwóch zmiennych:
echo "stdout : \n";
var_dump($stdout);
echo "stderr :\n";
var_dump($stderr);
Otrzymujemy następujący wynik podczas wykonywania skryptu 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
"
Nadzieja to pomaga :-)
Zalecam korzystanie z komponentu Symfony/Process. –