Nếu bạn muốn thực thi lệnh và nhận cả hai stderr
và stdout
, không được "hợp nhất", giải pháp có thể sử dụng proc_open
, cung cấp mức kiểm soát tuyệt vời đối với lệnh đang được thực hiện - bao gồm cả cách đến đường ống stdin
/stdout
/stderr
.
Và đây là một ví dụ: chúng ta hãy xem xét chúng tôi có điều này vỏ kịch bản, trong test.sh
, mà viết cho cả stderr
và 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;
Bây giờ, chúng ta hãy đang một số PHP, trong temp.php
- trước tiên, chúng tôi khởi tạo trình mô tả i/o:
$descriptorspec = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "w"), // stderr
);
Và, sau đó, thực hiện lệnh test.sh
, sử dụng những mô tả, trong thư mục hiện hành, và nói i/o nên từ/đến $pipes
:
$process = proc_open('./test.sh', $descriptorspec, $pipes, dirname(__FILE__), null);
Bây giờ chúng ta có thể đọc từ hai ống đầu ra :
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
Và, nếu chúng ta sản lượng nội dung của hai biến:
echo "stdout : \n";
var_dump($stdout);
echo "stderr :\n";
var_dump($stderr);
Chúng tôi nhận được đầu ra sau khi thực hiện kịch bản 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 :-)
Tôi sẽ khuyên bạn nên sử dụng thành phần Symfony/Process. –