2010-01-14 46 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'));