問題は次のいずれかであると思われます。
php.exe
PHP/php.exe
たとえば、あるべきPHP\php.exe
か何かのために、まったく実行されていません。
- コマンドは、バージョン情報を「出力」ストリームではなく「エラー」ストリームに書き込んでいます。
いずれにせよ、エラーストリームからの読み取りを試す必要があります。cmd
またはからのバージョン情報またはエラーメッセージが表示されますphp.exe
。
@dystroyの答えが間違っている理由も詳しく説明する必要があります。
exec
コマンドを実行するための新しい外部プロセスを作成することです。このプロセスはJVMに接続されているため、アプリケーションがgetOutput()
ストリームに書き込むとき、それは外部プロセスの「標準入力」に送られ、外部プロセスがその「標準出力」と「標準エラー」に書き込むとき、データは次のことができます。それぞれgetInput()
とgetError()
ストリームを使用して読み取ることができます。
それぞれのストリーム間の接続は、オペレーティングシステムによって提供される「パイプ」を使用して実装されます。
パイプについてのことは、それが限られたバッファリング容量しか持っていないということです。一方のプロセスが一方の端に書き込みを行っていて、もう一方のプロセスが読み取りを行っていない場合、書き込みプロセスは最終的に書き込みを停止するように強制されます。または、より正確には、書き込みシステムコールでブロックし、パイプラインがドレインするのを待ちます。
@dystroyの答えは、Java側でこれを行うと言っています:
- プロセスを開始します。
- プロセスが完了するのを待ちます
- プロセスからの出力を読み取ります。
ただし、外部プロセスが大量の出力を書き込む場合、パイプへの書き込み中にブロックされるため、完了できません。その間、Java側は、パイプからデータの読み取りを開始する前に、外部プロセスが完了するのを待機しています。
デッドロック。