0

私はphpでproc_openを使用してJavaアプリケーションを呼び出し、処理のために大きなテキストを送信し、返された結果をキャプチャします。1 つだけではなく、複数のテキスト文字列 (入力ストリーム) を渡すことは可能ですか?

これは私が現時点で持っているものです:

fwrite($pipes[0], $input);
fclose($pipes[0]);

$output = stream_get_contents($pipes[1]);
fclose($pipes[1]);

このようなことをしても、Java はそれを 1 つの入力ストリームとして認識します。

fwrite($pipes[0], $input);
fwrite($pipes[0], $input1);
fwrite($pipes[0], $input2);
fclose($pipes[0]);

$output = stream_get_contents($pipes[1]);
fclose($pipes[1]);

では、このようなことはまったく可能ですか?そうでない場合、代替手段はありますか?複数行の大きなテキストであるため、コマンド ライン パラメータを使用できません。

4

2 に答える 2

0

いいえ、プロセスには標準入力ストリームが 1 つだけでなく、標準出力ストリームも 1 つと標準エラー (出力) ストリームも 1 つしかありません (これは、java や php だけでなく、すべてのプロセスに当てはまります)。

  • 複数のストリームを許可するクライアントサーバーアーキテクチャなどのソケット通信をセットアップできますが、クライアント (php) とサーバー (java) の両方がマルチスレッドを実行できる場合にのみ役立ちます。
  • パイプを介して区切り文字シーケンスを送信できるため、Java は 3 つの入力文字列を区別できます。
  • 単純に複数の proc_open を使用できます

編集:

  • stdin と stdout の代わりにファイルを使用できます (php と java はそれらを共有できます)。
  • UNIX パイプを使用できますが (ソケット ソリューションと同様)、これを実装するのはかなり困難です。
于 2013-08-02T10:03:34.960 に答える
0

何をしようとしているのか、また Java アプリケーションが何を期待しているのかによって異なります。

$inputJava アプリケーションに,$input2との連結を認識させたい場合は$input3、コードでそれを行います。

Java がこれらの入力を個別のストリームとして自動的に認識できるようにしたい場合は、いいえ。Java IO システムに関する限り、バイトは単なるバイトです。自然の境界はありません...(結合された)ストリームの最終的な終わりを除けば。

Java に 1 つのストリームを認識させ、それを 3 つのストリームに分割することは可能ですが、プログラミングの労力が必要になります。

  • PHP 側では、ある種の「フレーミング」情報をストリームに追加して、1 つの「ストリーム」が終了し、次のストリームが開始する場所を Java 側に伝える必要があります。

  • Java 側では、そのフレーミング情報を探して解釈する必要があります。

フレーミングは、各ストリームのバイト数とそれに続くバイトを送信することによって行うことができます。または、ストリームの終わりを示すマーカー文字またはシーケンスを使用して行うこともできます。

于 2013-08-02T10:19:07.333 に答える