7

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

编辑:原来我不需要终止进程

4

5 回答 5

11

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

/B参数是这里的关键。

我似乎找不到我在哪里找到这个了。但这对我有用。

于 2012-06-05T14:11:00.823 回答
5

PHP手册中的这个函数有帮助吗?

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");
}
于 2010-01-15T01:30:47.453 回答
3

尝试在使用 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
于 2013-04-12T07:55:02.170 回答
1

来自 php 手册exec

如果使用此函数启动程序,为了使其继续在后台运行,程序的输出必须重定向到文件或另一个输出流。否则将导致 PHP 挂起,直到程序执行结束。

即管道输出到一个文件和php不会等待它:

exec('myprog > output.txt');

从记忆中,我相信有一个控制字符可以添加(就像使用 @ 一样)到exec命令系列中,它也可以防止执行暂停 - 虽然不记得它是什么。

编辑找到了!在 unix 上,使用 & 前缀执行的程序将在后台运行。对不起,对你帮助不大。

于 2010-01-14T22:15:28.573 回答
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'));
于 2017-05-26T18:46:38.890 回答