2012-07-24 28 views
3

於是我打開一個進程,$process = proc_open("my_process", $descriptors, $pipes);多次寫入一個進程打開與proc_open

於是我寫信給使用fwrite($pipes[0], "some_command");

然後,我必須使用fclose($pipes[0]);之前,我可以讀取關閉管道的過程的標準輸入從管道stdout使用$output = stream_get_contents($pipes[1]);。如果我不關閉管道,我的PHP腳本掛在這個電話上。

但是,一旦我收到了標準輸出,如果我要發送另一個命令的過程中有什麼輸出...標準輸入管道被關閉,所以我沒有辦法把它。那麼是否有可能以某種方式向該過程發送另一個命令?

回答

2

這聽起來像其他進程正在阻塞等待上STDIN EOL或EOF。你想要執行什麼?

無論如何,這種排序方法都很不錯:只需將\n附加到您發送給其他進程的命令上即可。

E.g.

$process = proc_open("my_process", $descriptors, $pipes); 

$command = "some_command"; 
fwrite($pipes[0], $command."\n"); 

// Fetch the contents of STDOUT 

現在,您也可運行到一個問題是事實,你正在使用stream_get_get_contents()做 - 這將等待EOF它返回之前。您可能要有點更智能地瞭解您從$pipes[1]檢索數據,使用fgets()並尋找特定行數或字符串來表示的輸出端。

如果您告訴我們您正在執行什麼,我或許可以給你一個更具體的答案。

+0

是,其它程序與它自己的外殼的交互式終端程序。如果我以'正常'開始另一個程序,即。通過終端,而不是通過PHP proc_open它會加載,然後顯示一個命令提示符,如'my_program >>',我可以運行命令。我曾嘗試追加'\ n'到$命令,但它不起作用。它將掛在stream_get_contents()上。使用fflush()也不起作用,它只在關閉$ pipes [0]時才起作用。 – 2012-07-24 15:18:59

+1

@Jim_CS嘗試上面的代碼,但是隻是'echo fgetc($ pipes [1]);' - 試着從另一個程序的STDOUT中獲取1個字符並在PHP中回顯它。我的猜測是,它是你的讀操作導致塊,而不是其他進程等待更多的輸入/ EOF。如果這不起作用,請嘗試從其他進程的STDERR獲取數據,它可能會輸出您想要的數據。 – DaveRandom 2012-07-24 15:23:18

+0

另一個程序輸出一些啓動文本,例如'Modules loaded:abc,xyz,...'等。因此,如果我使用$ output [] = fgets [$ pipes [1])的while循環,它首先會獲得大約8行啓動文本。如果我使用了fclose($ pipes [0]),它會給我處理我發送的命令的輸出。但是,如果我附加'\ n'或使用flush(),它將獲得8行啓動文本,但當它應該從我的命令中檢索輸出時會掛起。這看起來像我的命令沒有得到發送到程序的STDIN好像它正在發送我將能夠檢索結果。 – 2012-07-24 15:32:54