我正在寻找最好的,或者任何真正在后台从 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");
编辑:原来我不需要终止进程
shell_exec('start /B "C:\Path\to\program.exe"');
/B
参数是这里的关键。
我似乎找不到在哪里找到这个了。但这对我有用。
编辑:我在研究不同的东西时找到了我的来源https://superuser.com/a/591084/281094
这个 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");
}
尝试在 Windows 2000 服务器上使用 PHP 5.2.8 实现相同的目标。
所有解决方案都不适合我。 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
来自
exec
的 php 手册:
如果使用此函数启动程序,为了使其继续在后台运行,程序的输出必须重定向到文件或另一个输出流。如果不这样做将导致 PHP 挂起,直到程序执行结束。
即通过管道将输出传输到文件中,php 不会等待它:
exec('myprog > output.txt');
根据记忆,我相信您可以在
exec
系列命令前面添加一个控制字符(就像使用@一样),它也可以防止执行暂停 - 但不记得它是什么。
编辑找到了!在 UNIX 上,以 & 开头执行的程序将在后台运行。抱歉,帮不了你太多。
在我的 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'));