2014-02-19 130 views
2

假設我想在PHP表單上通過我的網頁運行服務器端命令。命令是du -hs,可能需要幾分鐘才能完成。我可以以某種方式使用exec()或shell_exec(),以便網頁立即重新加載並且不會等待命令的輸出?一個例子會很棒!謝謝!如何用PHP非阻塞運行linux終端命令?

<?php 
    exec('du -hs'); 
?> 
+2

這將['EXEC()'文檔】在被識別(http://us3.php.net/manual/en/function.exec.php)下的拳頭警告部分權利。 _如果一個程序以這個函數啓動,爲了繼續在後臺運行,程序的輸出必須被重定向到一個文件或另一個輸出流。否則會導致PHP掛起,直到程序執行結束。查看'symfony/process'。# –

+0

查看'symfony/process'。沒有必要重新發明輪子。 – KingCrunch

+0

這是你的答案 http://stackoverflow.com/questions/3819398/php-exec-command-or-similar-to-not-wait-for-result – manan

回答

4

HACK警惕,但如果你不想背景,(說你需要做的,結果東西),當它完成,你可以在一個析構函數方法把命令不在乎目的。請注意,雖然用戶將得到他們的迴應並可以自由地請求另一個頁面,但在完成之前,該流程不會從Apache或PHP-fpm中釋放。

class someClass{ 

     function __destruct(){ 
      exec('du -hs'); 
     }  
} 

注:可靠的方法來處理後臺任務是使用消息隊列和就業服務處理器打造出與Gearman的,RabbitMQ的,或者這樣的。

+0

我從來沒有聽說過這個,我很高興你添加了HACK ALERT。這有點嚇人但也很聰明,一定要在代碼中廣泛評論它! –

+0

@MichaelBerkowski我這樣做是爲了避免使用作業隊列服務器將用戶數據發送到我的電子郵件web服務來發送歡迎郵件,這可能需要一秒左右,但我不希望用戶等待一次他們註冊 – Ray

+0

@Ray非常有趣的黑客攻擊,但是有沒有這樣一種情況,比重定向命令的輸出更受歡迎?如果是這樣,你應該將它添加到你的答案中 – FtDRbwLXw6

1

這聽起來像你想在網頁上顯示du的結果,但不要等待它。這將需要ajax呼叫。

載入您的網頁,其中包含一個div,如:

<div id="du-div">Calculating filespace...</div> 

然後onload事件,通過這將運行並返回您的文件使用Ajax調用你的du.php。然後你更新你的div與內容。

2

由阿諾凌科的PHP文檔exec()上的top comment給你答案:

這將不PHP執行$ cmd在背景(無cmd窗口),等待它完成,上Windows和Unix。

<?php 
function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
     pclose(popen("start /B ". $cmd, "r")); 
    } 
    else { 
     exec($cmd . " > /dev/null &"); 
    } 
} 
?>