ホームページ >バックエンド開発 >PHPチュートリアル >PHP の Exec() コマンドから stdout と 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 サイトの他の関連記事を参照してください。