2011-05-03 34 views
1

忘掉它你怎麼發出來的shell命令,然後忘記它的輸出等?例如:發行的事情外殼和PHP

<?php 
echo `sleep 2;echo hi`; 
echo "foo"; 
?> 

這樣做的結果是hifoo。我想要一個給我foohi的結果。爲什麼?我想要發佈到shell的命令只是發出和忘記,我很困惑爲什麼PHP會等待結果。這樣的結果可能嗎?

(這背後的想法是建立硒電網RC實例的正確數量的編程。目前,它就會停止第一個進程打開後)

+0

您分叉進程並殺死父進程,從而有效地進行守護進程。只要確保它在完成任務後退出。 – 2011-05-03 20:50:17

+0

@ N.B .:注意需要關閉標準文件描述符才能讓父節點退出。 – Orbling 2011-05-03 20:53:12

回答

3

從php.net EXEC()

如果程序以此 函數啓動,爲使其繼續在後臺運行 ,程序的輸出 必須重定向到 文件或其他輸出流。如果這樣做失敗 將導致PHP掛起,直到 程序的執行結束。

這同樣適用於所有的shell命令。

+0

我怎麼會在給定的例子中做到這一點? '睡2;回聲嗨> tmp.txt'是我猜測,但不這樣做。 – tipu 2011-05-03 20:51:00

+0

需要後臺接口,'...&' - 所有輸出都需要重定向,'STDIN,STDOUT,STDERR'。 – Orbling 2011-05-03 20:51:04

0

它像什麼,你在命令提示符下執行的,除非你採取措施,把新的命令在後臺,外殼(和PHP)將阻塞,直到命令退出。試試這個:

<?php 
echo `(sleep 2; echo hi) &`; 
echo 'foo'; 
?> 

注意圍繞你的命令的支架,不如此,& woulud只適用於回聲,而且你還有2秒的暫停。