2013-08-02 46 views
0

我在php中使用proc_open來調用java應用程序,發送一個大文本給它進行處理並捕獲返回的結果。是否可以傳遞幾個文本字符串(輸入流)而不是一個?可以proc_open(php => java)有多個輸入流?

這是我在此刻得到了:

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

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

如果我做這樣的事情,JAVA仍然將其識別爲一個輸入流:

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

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

原來是這樣的可能呢?如果沒有,還有其他的選擇我不能使用命令行參數,因爲它是一個包含多行的大文本。

回答

0

這取決於你想要做什麼,以及java應用程序的期望。

如果您希望Java應用程序看到連接$input,$input2$input3,那麼確定...您的代碼將執行此操作。

如果您希望Java能夠自動將這些輸入視爲不同的流,則不會。就Java IO系統而言,字節只是字節。除了(合併)流的最終結局之外,沒有天然的界限。

如果您希望Java看到一條可以分割成三條流的流,那麼這是可能的,但這需要一些編程工作。

  • 在PHP端,你必須某種「框架」的信息添加到,告訴其中一個「流」結束和下一個啓動Java側流。

  • 在Java方面,您必須查找/解釋該成幀信息。

成幀可能通過發送一個字節計數爲每個數據流隨後的字節來完成,或者它可以與該指定流的結束標記字符或序列來完成。

0

不,一個進程只有一個標準輸入流,以及一個標準輸出流和一個標準錯誤(輸出)流(這對每個進程都是如此,不僅僅是java或php)。

  • 您可以設置一些套接字通信,例如一個客戶端 - 服務器體系結構,這將允許多個流,但只有當客戶端(php)和服務器(java)都可以執行多線程時纔有所幫助。
  • 您可以通過管道送一些分隔符序列,所以Java可以區分三種輸入字符串
  • 你可以簡單地使用一個以上的proc_open

編輯:

  • 您可以使用文件而不是stdin和stdout(php和java可以共享這些)
  • 您可以使用unix管道(類似於套接字解決方案),但這很難實現。