60

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

$url = exec('report');

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

4

6 に答える 6

81

コマンドを実行し、「マージ」ではなく と の両方を取得したい場合、解決策はおそらく を使用stderrするでしょう。stdoutproc_openstdinstdoutstderr

そして、ここに例があります: と の両方に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 = 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
"
于 2010-02-23T18:50:51.680 に答える
6

マージされていない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);
于 2012-11-22T13:17:26.867 に答える