2013-01-03 84 views
0

我有一些PHP代碼,我需要在服務器的後臺啓動一個ruby腳本。但腳本不想工作。所有的腳本現在都會得到輸入並將其回顯。在PHP中的shell_exec問題

我調用它像這樣:

shell_exec("./fifo_test.r <input.fifo> buffer &"); 

這將導致PHP無限期掛起。但是當我直接運行它時它工作正常。

[email protected]:/var/www/test# su www-data 
$ sh -c ./fifo_test.r <input.fifo> buffer & 
$ echo test > input.fifo 
$ cat buffer 
Got: test 

下面是過程信息:

[email protected]:~$ ps -ef | grep fifo 
www-data 1076  1 0 00:39 ?  00:00:00 sh -c ./fifo_test.r <input.fifo> buffer & 

有什麼想法?謝謝!

編輯:我可以通過手動添加到input.fifo來解凍PHP。然後它工作正常後。但是當PHP啓動它時,它會永遠等待第一個輸入。我不知道如何避免這種情況!

+0

shell_exec和exec,passthru等類似的函數被認爲是危險的,應該在你的php配置中禁用。 – markus

+0

爲什麼我會禁用我想明確使用的東西? – user1222728

回答

1

如果PHP腳本正在生成輸入,請使用popen()。這樣,你可以避免使用命名管道。

如果輸入來自其他源,最好不要讓您的PHP腳本(或其執行的Ruby腳本)直接從FIFO中讀取。我知道這是因爲試圖編寫一個Web界面來實時顯示捕獲的網絡數據包並遇到類似的問題。

我會寫一個接受Unix套接字連接的簡單服務器程序。該服務器可以接受來自FIFO或另一個套接字連接的輸入,然後將其發送到所有正在運行的PHP或Ruby腳本實例。您可以使用onlycorefeatures在CLI版本的PHP中編寫這樣的服務器,但Node.js(用於JavaScript),Twisted(用於Python)和EventMachine(用於Ruby)是專門爲此類設計的。

+0

謝謝,無論如何,我一直有意要學習一些節點。 – user1222728

1

您可以嘗試在shell調用中使用nohup命令。這應該會導致程序立即返回,所以PHP不會等待。代碼在你的情況看起來像這樣:

shell_exec("nohup ./fifo_test.r <input.fifo> buffer &"); 

希望幫助!

+0

嗯,不,它仍然停止命令:( – user1222728