PHP StdErr Exec() 後の質問

PHP StdErr Exec() 後の質問

PHP では exec() を使用してコマンドを実行し、成功すると URL を返します。

$url = exec('report');

ただし、何か問題が発生した場合に stderr を確認したいと思います。ストリームをどのように読み取ればよいでしょうか? php://stderr を使用したいのですが、使い方がよくわかりません。

ベストアンサー1

コマンドを実行して、stderrと の両方をstdout「マージ」せずに取得したい場合は、おそらく次のような解決策が考えられます。proc_openこれにより、実行中のコマンドを高度に制御できるようになり、// をパイプする方法も含まれるようにstdinなりstdoutますstderr

次に例を示します。 に、と のtest.sh両方に書き込む次のシェル スクリプトがあるとします。stderrstdout

#!/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
"

おすすめ記事