ホームページ >バックエンド開発 >PHPチュートリアル >PHP の Exec() コマンドから stdout と stderr の両方をキャプチャするにはどうすればよいですか?

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-30 03:28:16289ブラウズ

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

Exec() 後の PHP StdErr

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

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

例:

次のシェル スクリプト test.sh について考えてみましょう。これは stderr と 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 でこのスクリプトを実行し、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 スクリプトからの stdout ストリームと stderr ストリームが表示されます。

以上がPHP の Exec() コマンドから stdout と stderr の両方をキャプチャするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。