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