从php运行node file.js,并在卸载-Windows上杀死它

从php运行node file.js,并在卸载-Windows上杀死它,php,jquery,node.js,windows,Php,Jquery,Node.js,Windows,我的目标是在脚本开始时从php页面运行一个节点文件,然后在页面关闭时终止该进程。我一直在读一些问题和答案,但运气不好。我可以以身作则 exec("node myapp.js arg1 arg2 2>&1", $retArr); 在我的节点文件中,我添加了: console.log(process.pid); 现在我在输出数组上接收到进程的PID,但必须结束,有了这个,我可以稍后用exec'taskkill/PID.$array[x]./f来终止它,我如何从php获得进程PID

我的目标是在脚本开始时从php页面运行一个节点文件,然后在页面关闭时终止该进程。我一直在读一些问题和答案,但运气不好。我可以以身作则

exec("node myapp.js arg1 arg2 2>&1", $retArr);
在我的节点文件中,我添加了:

 console.log(process.pid);
现在我在输出数组上接收到进程的PID,但必须结束,有了这个,我可以稍后用exec'taskkill/PID.$array[x]./f来终止它,我如何从php获得进程PID来只终止那个进程

任何灯光都会让人赏心悦目。提前感谢。

Windows用户:

好的,我找到了一个解决这种情况的方法,以防有人面临同样的问题

在PHP中 节点应用程序需要在定义的端口中侦听,因此您可以将该端口作为参数传递给节点应用程序,我需要在PHP开始时在后台启动该节点应用程序,从所有可能的解决方案来看,这是一个最适合我的解决方案:

$rshell = new COM("WScript.Shell");
$rexec = $rshell->Run("node C:\PATH\TO\NODE\APP\myapp.js ".$appPort." ", 0, false); 
这将在后台运行应用程序,并且您的侦听端口位于一个变量中

在Node.js中 节点应用程序可以接收参数,您可以使用以下方法检索参数:

process.argv.forEach((val, index) => {
    console.log(`${index}: ${val}`);
});

var appPort = process.argv[2];
...
app.listen(appPort);
回到PHP 很好,到目前为止,您可以在后台从php启动node应用程序,并且您有侦听端口,因此现在我们创建一个新的php文件来处理关闭过程,比如closeNode.php,它将通过AJAX onunload接收侦听变量:

$( window ).unload(function() {
  <!-- your ajax call sending the appPort variable-->
}); 

也许不是更优雅的解决方案,但它是有效的。

唯一的问题是,如果用户重新加载页面,应用程序仍然会被杀死。在再次触发之前,尝试添加睡眠和检查是否已启动的条件可能是解决方案
$appPort = $_POST('appPort')

exec('netstat -a -n -o | find "LISTENING" | find "'.$appPort.'"', $result);

if (!empty($result)) {

$pidArray = array();

foreach ($result as $value) {    

// our pid is at the end of the string, then we trim the last 10 characters that is enough for the pid process number

$pidArray[] = substr($value, -10);

}

$pidTrimmed = array_map('trim', $pidArray);
$pid = $pidTrimmed[0];

exec('taskkill /f /PID '.$pid.'', $resultKill);