PHP では exec() を使用してコマンドを実行し、成功すると URL を返します。
$url = exec('report');
ただし、何か問題が発生した場合に stderr を確認したいと思います。ストリームをどのように読み取ればよいでしょうか? php://stderr を使用したいのですが、使い方がよくわかりません。
ベストアンサー1
コマンドを実行して、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 = [
0 => ["pipe", "r"], // stdin
1 => ["pipe", "w"], // stdout
2 => ["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
"