PHP在Windows机器上;在后台启动流程

时间:2010-01-14 22:02:52

标签: php windows background kill nohup

我正在寻找最好的,或任何方式真正从后台启动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");

编辑:原来我不需要杀死进程

5 个答案:

答案 0 :(得分:10)

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

此处/B参数是关键。

我似乎无法找到我发现它的位置了。但这对我有用。

答案 1 :(得分:5)

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");
}

答案 2 :(得分: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

答案 3 :(得分:1)

来自exec的php手册:

  

如果使用此功能启动程序,为了使其在后台继续运行,必须将程序的输出重定向到文件或其他输出流。如果不这样做将导致PHP挂起,直到程序执行结束。

即将输出传递到文件中,php不会等待它:

exec('myprog > output.txt');

从内存中,我相信你可以在exec系列命令之前添加一个控制字符(就像你使用@一样),它也可以阻止执行暂停 - 但是不记得它是什么。

修改找到它!在unix上,用&执行的程序prepended将在后台运行。对不起,对你帮助不大。

答案 4 :(得分:1)

在我的Windows 10和Windows Server 2012计算机上,在pclose / popen中可靠运行的唯一解决方案是调用powershell的Start-Process命令,如:

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'));