2012-02-15 103 views
0

我正在編寫一個PHP腳本,它將在服務器上啓動一個程序。PHP exec()不返回

我這樣寫:

exec('myAppName'); 

這一行的,因爲它實際上執行的程序代碼「作品」,但是,我不能得到它從該行返回(繼續過去的)。

它只會掛在那裏,直到我手動關閉打開的程序或超出max_execution_time。

我錯過了一些明顯的東西嗎?

+0

你想「fork」然後執行exec嗎?因爲'exec'不應該以某種方式「背景」這個過程。 – Borealid 2012-02-15 19:22:05

+1

在黑暗中拍攝,但嘗試使用['passthru()'](http://php.net/passthru)而不是'exec()'。程序的輸出可能會揭示一些事情。 – 2012-02-15 19:22:18

+0

嘗試passthru()以及相同的結果。 – 2012-02-15 19:47:04

回答

0

背景在PHP中的過程中,你需要做這樣的事情:

function spawnBackgroundProcess($sProcessLine) 
{ 
    $aPipes = array(); 

    $rProcess = proc_open($sProcessLine, array(), $aPipes); 
    proc_close($rProcess); 
} 

真的多數民衆贊成濫用proc_ *系列,但它是可悲的是最好的辦法。

(不要忘了&!)

1

manual for exec,而不是在等待啓動的程序退出的事情完全清楚,各國的返回值是

返回值:從命令結果的最後一行。

換句話說,就像您正在觀察的那樣,爲了返回最後一行輸出,exec將不會返回,直到啓動的程序退出。

0

您需要將其作爲背景以繼續其餘的PHP我相信。

在Unix/Linux中,使用「&」字符。 ..

嗯或者是那個系統,那..該死的,不記得現在 - 將再次閱讀手冊。

+0

我應該在原文中說明,但我在Windows服務器上。 – 2012-02-15 19:49:25

0

如果你想不具有腳本等待結果在後臺執行一個命令,就可以執行以下操作:

<?php 
passthru("/usr/bin/php /path/to/script.php ".$argv_parameter." >> /path/to/log_file.log  2>&1 &"); 
?> 

有這裏有幾件重要的事情。

首先:把完整的路徑放到php二進制文件中,因爲這個命令將在apache用戶下運行,並且你可能沒有像在該用戶中設置的php那樣的命令別名。

秒:注意2在命令字符串末尾的事情:'2> & 1'和'&'。 '2> & 1'用於將錯誤重定向到標準IO。最重要的是命令字符串末尾的'&',它告訴終端不要等待響應。

三:確保你對 'log_file.log' 文件

享受777個權限!