2015-01-13 124 views
0

我嘗試在後臺執行php中的.bat文件(帶有xampp的Windows Server)。當我點擊按鈕後,它也應該去另一個網站。 但是當我點擊按鈕時,瀏覽器正在等待腳本完成。大多數情況下,這是以超時結束。從後臺執行.bat文件

我的PHP代碼:

if (isset($_POST['test'])) 
{ 
    exec('C:\Daten\test.bat'); 
    header("Location:test_status.php"); 
} 

我怎麼能告訴PHP EXEC,以不等待?

我也試過以下,但不工作:

exec('C:\Daten\test.bat' . '> /dev/null &'); 
+0

你試過'pclose函數(POPEN( 「開始/ B」。$ CMD, 「R」) );'[from here](http://php.net/manual/en/function.exec.php#86329)其中'$ cmd'是你想運行的命令。 – MoshMage

+0

這可以幫助http://stackoverflow.com/questions/649634/how-do-i-run-a-bat-file-in-the-back-from-another-bat-file –

+0

相關,[你怎麼樣從PHP運行一個.bat文件?](http://stackoverflow.com/q/835941) – jww

回答

1

你使用的是Windows。在Windows中沒有/dev/null(這只是nul),並且沒有&在後臺運行作業。 cmd.exe中的&是一個命令分隔符。所以你的exec()會掛起/等待.bat完成。

嘗試

exec('start c:\daten\test.bat'); 

代替,這將啓動批處理文件作爲一個單獨的進程。

+0

有關'cmd.exe'的好評如果'bash'不能以同樣的方式工作:-) – axiac

+0

不能保證'調用cmd.exe'(在原始解決方案和此答案上)。 PHP要求系統執行一個擴展名爲'的文件。bat',系統代碼會諮詢Windows註冊表並發現'.bat'文件被傳遞給某個命令解釋器以供執行。默認情況下,它是Windows的'cmd.exe',但可以安裝其他命令解釋器,並且解釋器可以將自己註冊爲執行'.bat'文件的處理程序。 – axiac

0

感謝您的回覆,但這並不適合我。我在互聯網上發現了許多解決方案的想法,但沒有爲我工作。

現在我終於找到了解決方案! 關鍵字是popen!這工作不錯:

$handle = popen ('start /B C:\Data\restart_TS3.bat > C:\Daten\restart_TS3.log 2>&1', 'r'); 
pclose ($handle); 
header("Location:ts3_status.php"); 

此做如下: POPEN打開啓動該批處理文件,輸出去日誌文件的後臺進程。 然後你需要用pclose關閉它。 (該批次仍在後臺運行) 之後,它打開另一個網站,在我的情況下它是一個「查看當前狀態」網站。

如果你不想要一個日誌,你也可以輸出(比如MarkB之前告訴過的)> nul。這看起來是這樣的:

$handle = popen ('start /B C:\Data\restart_TS3.bat >nul 2>&1', 'r'); 

並注意路徑中的空白空間! 我不知道爲什麼,但是這是不行的: '開始/ B 「C:\ Data文件夾\ restart_TS3.bat」> NUL 2> & 1' 在您需要的「文件夾中的一樣,那情況:

$handle = popen ('start /B C:\"Data Folder"\restart_TS3.bat >nul 2>&1', 'r'); 

這正常工作與空的空間在文件夾名稱。

0

這爲我工作。

exec("start cmd /c test.bat", $output); 
var_dump($output); 
+0

很好的答案。許多人不知道在Windows中,運行'exec'時必須在開始處包含'start'關鍵字。另外,如果你希望你的'exec'是異步的,只需在末尾添加一個'&'。 –

+0

在發佈代碼時,添加對嘗試實現的內容的解釋總是更好。 –