从php运行node file.js,并在卸载-Windows上杀死它
我的目标是在脚本开始时从php页面运行一个节点文件,然后在页面关闭时终止该进程。我一直在读一些问题和答案,但运气不好。我可以以身作则从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
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);