我正在編寫一個PHP腳本,它將在服務器上啓動一個程序。PHP exec()不返回
我這樣寫:
exec('myAppName');
這一行的,因爲它實際上執行的程序代碼「作品」,但是,我不能得到它從該行返回(繼續過去的)。
它只會掛在那裏,直到我手動關閉打開的程序或超出max_execution_time。
我錯過了一些明顯的東西嗎?
我正在編寫一個PHP腳本,它將在服務器上啓動一個程序。PHP exec()不返回
我這樣寫:
exec('myAppName');
這一行的,因爲它實際上執行的程序代碼「作品」,但是,我不能得到它從該行返回(繼續過去的)。
它只會掛在那裏,直到我手動關閉打開的程序或超出max_execution_time。
我錯過了一些明顯的東西嗎?
背景在PHP中的過程中,你需要做這樣的事情:
function spawnBackgroundProcess($sProcessLine)
{
$aPipes = array();
$rProcess = proc_open($sProcessLine, array(), $aPipes);
proc_close($rProcess);
}
真的多數民衆贊成濫用proc_ *系列,但它是可悲的是最好的辦法。
(不要忘了&!)
的manual for exec
,而不是在等待啓動的程序退出的事情完全清楚,各國的返回值是
返回值:從命令結果的最後一行。
換句話說,就像您正在觀察的那樣,爲了返回最後一行輸出,exec
將不會返回,直到啓動的程序退出。
您需要將其作爲背景以繼續其餘的PHP我相信。
在Unix/Linux中,使用「&」字符。 ..
嗯或者是那個系統,那..該死的,不記得現在 - 將再次閱讀手冊。
我應該在原文中說明,但我在Windows服務器上。 – 2012-02-15 19:49:25
如果你想不具有腳本等待結果在後臺執行一個命令,就可以執行以下操作:
<?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個權限!
你想「fork」然後執行exec嗎?因爲'exec'不應該以某種方式「背景」這個過程。 – Borealid 2012-02-15 19:22:05
在黑暗中拍攝,但嘗試使用['passthru()'](http://php.net/passthru)而不是'exec()'。程序的輸出可能會揭示一些事情。 – 2012-02-15 19:22:18
嘗試passthru()以及相同的結果。 – 2012-02-15 19:47:04