我正在寻找最好的,或任何真正的方式从后台启动一个PHP的过程,所以我可以在脚本中稍后杀死它。
现在,我正在使用:shell_exec($ Command); 问题在于它等待程序closures。
当我执行shell命令时,我想要和nohup具有相同的效果。 这将允许我在后台运行该进程,以便稍后在脚本中可以closures该进程。 我需要closures它,因为这个脚本将定期运行,并且程序在运行时不能打开。
我曾经想过生成一个.bat文件来在后台运行这个命令,但是即使如此,我以后如何杀死这个进程呢?
我见过的Linux代码是:
$PID = shell_exec("nohup $Command > /dev/null & echo $!"); // Later on to kill it exec("kill -KILL $PID");
编辑 :原来我不需要杀死这个过程
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"); }
shell_exec('start /B "C:\Path\to\program.exe"');
/B
参数在这里是关键的。
我似乎无法找到我在哪里找到了这个。 但是这对我有用。
试图在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
从执行的PHP手册:
如果一个程序用这个函数启动,为了继续在后台运行,程序的输出必须被重定向到一个文件或另一个输出流。 如果不这样做将导致PHP挂起,直到程序执行结束。
即管输出到一个文件和PHP不会等待它:
exec('myprog > output.txt');
从内存中,我相信有一个控制角色,你可以预先(像你用@做的那样)给exec
系列的命令,这也可以防止执行暂停 – 不记得它是什么。
编辑发现它! 在unix上,用&prepended执行的程序将在后台运行。 对不起,没有多大的帮助。
在我的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'));