「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > PHP の Exec() コマンドから stdout と stderr の両方をキャプチャするにはどうすればよいですか?

PHP の Exec() コマンドから stdout と stderr の両方をキャプチャするにはどうすればよいですか?

2024 年 12 月 13 日に公開
ブラウズ:444

How Can I Capture Both stdout and stderr from an Exec() Command in PHP?

Exec() 後の PHP StdErr

PHP では、exec() 関数はコマンドを実行し、コマンドの標準出力から出力を返します。ただし、コマンドが stderr に書き込む場合、この出力は exec() によってキャプチャされません。

コマンドから stdout と stderr の両方をキャプチャするには、proc_open() 関数を使用できます。 proc_open() は、コマンドの stdin、stdout、および stderr ストリームをパイプする機能など、コマンド実行プロセスに対するより高度な制御を提供します。

例:

次のシェル スクリプト test.sh について考えてみましょう。これは stderr と stderr の両方に書き込みます。標準出力:

#!/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 で実行して stdout と stderr の両方をキャプチャするには、次のコードを使用できます:

$descriptorspec = [
    0 => ['pipe', 'r'],  // stdin
    1 => ['pipe', 'w'],  // stdout
    2 => ['pipe', 'w'],  // stderr
];

$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]);

echo "stdout : \n";
var_dump($stdout);

echo "stderr :\n";
var_dump($stderr);

Output:

上記の 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"

出力には、test.sh スクリプトからの標準出力ストリームと標準エラー出力ストリームが表示されます。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3