2010-09-19 131 views
3

我有StartServer.php文件,基本上啓動一個服務器,如果它尚未啓動。除了StartServer.php將永遠掛起等待shell_exec()的'd文件Server.php來完成它永遠不會執行的執行之外,一切都很完美。執行另一個PHP文件,無需等待它完成其執行

有沒有辦法執行一個PHP文件,並忘記它 - 而不是等待它的執行完成?

編輯:它必須在Windows和Linux上工作。

+0

在iFrame內執行文件?或者它是掛起的服務器而不是瀏覽器?你是否通過cron工作來運行這個腳本? – Glycerine 2010-09-19 11:16:23

+0

這純粹是與服務器相關的問題。 PHP腳本A想要執行另一個PHP腳本B,以便A完成它的執行,而B永遠不會執行它。 – Tower 2010-09-19 11:17:08

回答

3

這會幫助你 - Asynchronous shell exec in PHP

基本上,你shell_exec("php Server.php > /dev/null 2>/dev/null &")

+0

只適用於Linux。我如何在Windows中執行此操作? – Tower 2010-09-19 11:51:12

+0

據我所知PHP沒有任何線程,所以你需要開始一個單獨的過程。這些細節總是會與平臺有關。 – 2010-09-19 12:07:47

0

你需要的東西像pcntl functions。唯一的問題是,這是一個非Windows擴展,不適合在Web服務器中運行。我能想到的唯一的另一種可能性是使用exec函數並手動分叉當前進程(如dekomotes的答案中所建議的那樣),執行OS檢測以找出所需的命令。請注意,這種方法與使用pcntl函數(至少在Linux中)沒有太大區別 - 和號字符會導致第二個腳本在不同的進程中運行。 PHP中不支持多線程/多進程編程,特別是在Web服務器中運行時。

0

我認爲這是傳統的讓服務器分離自己形成父進程,即「守護進程」本身,而不是讓腳本啓動服務器分離自己。檢查你開始看到的服務器是否有守護進程選項。

如果你自己編寫服務器,使用PHP,你需要分離它。它看起來像這樣:

posix_setsid(); //Start a new session 
if(pcntl_fork()) {exit();} //Fork process and kill the old one 

我認爲這也適用於Windows。 (未測試)

相關問題