PHP では、exec() を使用してコマンドを実行しています。成功すると URL が返されます。
$url = exec('report');
ただし、何か問題が発生した場合は、stderr を確認したいと思います。ストリームをどのように読みますか? php://stderr を使いたいのですが、使い方がわかりません。
コマンドを実行し、「マージ」ではなく と の両方を取得したい場合、解決策はおそらく を使用stderr
するでしょう。stdout
proc_open
stdin
stdout
stderr
そして、ここに例があります: と の両方にtest.sh
書き込むこのシェルスクリプトが にあると考えてみましょう:stderr
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;
それでは、PHP のコードを書きましょうtemp.php
-- 最初に、i/o 記述子を初期化します。
$descriptorspec = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "w"), // stderr
);
そして、test.sh
それらの記述子を使用して、現在のディレクトリでコマンドを実行し、i/o が from/to であることを示し$pipes
ます。
$process = proc_open('./test.sh', $descriptorspec, $pipes, dirname(__FILE__), null);
2 つの出力パイプから読み取ることができるようになりました。
$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);
そして、これら 2 つの変数の内容を出力すると、次のようになります。
echo "stdout : \n";
var_dump($stdout);
echo "stderr :\n";
var_dump($stderr);
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
"
マージされていないstdout/stderrを取得する別の方法。
$pp_name = "/tmp/pp_test";
@unlink($pp_name);
posix_mkfifo($pp_name, 0777);
$pp = fopen($pp_name, "r+");
stream_set_blocking($pp, FALSE);
exec("wget -O - http://www.youtube.com 2>$pp_name", $r_stdout);
$r_stderr = stream_get_contents($pp);
var_dump($r_stderr);
fclose($pp);
unlink($pp_name);
stdoutを無視して、stderrのみを取得したい場合は、次のことを試すことができます。
exec("wget -O - http://www.youtube.com 2>&1 >/dev/null", $r_stderr);