2010-01-14 44 views
6

我正在尋找最好的,或任何真正的方式來從後臺啓動一個過程,所以我可以在後面的腳本中殺死它。在Windows機器上的PHP;在後臺啓動進程

現在,我正在使用:shell_exec($ Command); 問題在於它等待程序關閉。

我想要的東西,當我執行shell命令時會有nohup相同的效果。這將允許我在後臺運行該進程,以便稍後在腳本中可以關閉該進程。我需要關閉它,因爲這個腳本會定期運行,並且程序在運行時不能打開。

我想過生成一個.bat文件來在後臺運行該命令,但即使如此,我該如何殺死該進程?

我見過用於Linux的代碼是:

$PID = shell_exec("nohup $Command > /dev/null & echo $!"); 
// Later on to kill it 
exec("kill -KILL $PID"); 

編輯:原來我不需要殺死進程

+0

那麼解決方案是什麼? – Aramil 2017-05-07 18:08:52

回答

4

請問這個function from the PHP Manual有幫助嗎?

function runAsynchronously($path,$arguments) { 
    $WshShell = new COM("WScript.Shell"); 
    $oShellLink = $WshShell->CreateShortcut("temp.lnk"); 
    $oShellLink->TargetPath = $path; 
    $oShellLink->Arguments = $arguments; 
    $oShellLink->WorkingDirectory = dirname($path); 
    $oShellLink->WindowStyle = 1; 
    $oShellLink->Save(); 
    $oExec = $WshShell->Run("temp.lnk", 7, false); 
    unset($WshShell,$oShellLink,$oExec); 
    unlink("temp.lnk"); 
} 
+0

我最終使用(幾乎)這個來啓動一個批處理文件,現在它完美的工作。 – 2010-01-16 19:01:13

+0

對不起,挖出這個古老的墳墓。我使用相同的代碼來執行我在C#中創建的外部程序。瀏覽器/ php腳本或apache只是掛起,如果這個c#應用程序拋出一個異常。有沒有解決這個問題? – WatsMyName 2013-10-30 08:07:31

+0

@LoVeSmItH:不知道的人。 = \ – 2013-10-30 19:32:04

1

從PHP手冊exec

如果一個程序以該函數啓動,爲了繼續在後臺運行,程序的輸出必須被重定向到一個文件或另一個輸出流。否則會導致PHP掛起,直到程序執行結束。

即管道輸出到一個文件和PHP不會等待它:

exec('myprog > output.txt'); 

從內存中,我相信這是一個控制字符,你可以預定(像你這樣做@)到exec命令系列也阻止執行暫停 - 不記得它是什麼。

編輯找到了!在unix上,前面執行&的程序將在後臺運行。對不起,沒有多大幫助。

+0

我結束了使用批處理文件,並執行: 系統(「cmd/c C:[文件路徑]」); 這使腳本繼續。關於如何殺死這個過程的任何想法?這實際上打開了Adobe Reader,我仍然需要一種方法在腳本再次運行之前關閉它。 – 2010-01-14 22:34:36

+0

沒關係,事實證明我不需要殺死這個過程。我可以讓它繼續運行。 – 2010-01-14 22:46:27

+1

我目前正在Windows系統上嘗試這種方式,它仍然在等待腳本在瀏覽器窗口中結束,而不管它輸出到文件中。對此有何想法? – 2014-10-19 12:15:55

8

shell_exec('start /B "C:\Path\to\program.exe"');

/B參數在這裏是關鍵。

我似乎無法找到我在哪裏找到了這個。但這對我很有用。

+0

我不知道/ B。非常方便,謝謝。 – 2012-06-05 17:27:00

+0

爲了完整起見,我將鏈接留在關於start命令的文檔中:https://technet.microsoft.com/en-us/library/cc770297(v=ws.11).aspx – zinky 2017-11-19 12:55:03

2

試圖使用PHP 5.2.8在Windows 2000服務器上實現相同。

沒有解決方案爲我工作。 PHP一直在等待響應。

找到了解決辦法是:

$cmd = "E:\PHP_folder_path\php.exe E:\some_folder_path\backgroundProcess.php"; 
pclose(popen("start /B ". $cmd, "a")); // mode = "a" since I had some logs to edit 
1

在我的Windows 10和Windows Server 2012臺的機器,只有pclose函數內可靠工作的解決方案/ POPEN是調用PowerShell的開始處理指令,如:

pclose(popen('powershell.exe "Start-Process foo.bat -WindowStyle Hidden"','r')); 

或者更冗長,如果你想提供參數和重定向輸出:

pclose(popen('powershell.exe "Start-Process foo.bat 
      -ArgumentList \'bar\',\'bat\' 
      -WindowStyle Hidden 
      -RedirectStandardOutput \'.\\console.out\' 
      -RedirectStandardError \'.\\console.err\'"','r'));