muhtemelen idam edilecek komuta üzerinde kontrol büyük bir düzeyi sağlar proc_open
kullanmak istiyorum, bir çözüm, bir komutu çalıştırmak ve stderr
ve stdout
hem değil "birleştirilmiş" almak istiyorsanız - Bir bakıma dahil stdin
/stdout
/stderr
numaralı boruya.
Ve burada bir örnek: temp.php
yılında, kod Biraz PHP edelim, Şimdi
#!/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;
: en ikimiz de stderr
ve stdout
yazar, hangi test.sh
yılında, bu kabuk senaryomuz var düşünelim
$descriptorspec = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "w"), // stderr
);
: - ilk olarak, i/o tanımlayıcıları başlatmakVe o zaman, geçerli dizinde, bu tanımlayıcılar kullanarak ve i/o gelen/$pipes
olmalıdır söyleyerek test.sh
komutu çalıştırın: Şimdi iki çıkış borusundan okuyabilir
$process = proc_open('./test.sh', $descriptorspec, $pipes, dirname(__FILE__), null);
:
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
Ve biz çıkışı bu iki değişkenin içeriği ise:
echo "stdout : \n";
var_dump($stdout);
echo "stderr :\n";
var_dump($stderr);
senaryoyu çalıştırırken
Biz şu çıktıyı almak:
$ 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
"
Umut bu yardımcı olur :-)
Symfony/Process bileşenini kullanmanızı tavsiye edeceğim. –