node.js (socket.io 聊天) ram 使用率上升并停止工作

node.js (socket.io chat) ram usage goes up and stop working

我的 socket.io 聊天应用程序有点问题。当我启动它时,它使用 1% RAM,当它运行 2 天时,它上升到 10%+ 并停止工作,我不得不一次又一次地重新启动它....这是我的代码,我怎么能修理它? 感谢您的回答!

var https = require('https');
var fs = require('fs');
var mysql = require('mysql');


var mysqlInfo;
mysqlInfo = {
  host     : 'localhost',
  user     : 'user',
  password : 'pass',
  database : 'user',
  charset  : 'utf8_general_ci'
};

var mysqlConnection = mysql.createConnection(mysqlInfo);


var options = {
    key:    fs.readFileSync('ssl/server.key'),
    cert:   fs.readFileSync('ssl/server.crt'),
    ca:     fs.readFileSync('ssl/ca.crt')
};
var app = https.createServer(options);
io = require('socket.io').listen(app);
app.listen(3000);

var login_users = {};

var channels = ['english'];


io.on('connection', function(socket){
        setTimeout(function(){
                socket.emit('login', '');
        }, 1000);
        socket.join('english');
        socket.channel='english';
        socket.on('login', function(login){
                var login_json = JSON.parse(login);
                mysqlConnection.query("SELECT id FROM users WHERE id=? and token=?", [login_json.id,login_json.token], function(err, results) {
                        if(results.length==1){
                                login_users[socket.id] = socket;
                                login_users[socket.id]["id"] = login_json.id;
                                login_users[socket.id]["token"] = login_json.token;
                                socket.join(login_json.id);
                        }
                });
        });
        socket.on('chat', function(message){
                if(typeof socket.id !== 'undefined'){
                        mysqlConnection.query("SELECT * FROM users WHERE id=? and token=?", [socket.id,socket.token], function(err, results) {
                                        io.in(socket.channel).emit('chat', '{"message":"'+message+'"}');
                                }
                        });
                }
        });
        socket.on('channel_change', function(channel){
                if (channels.indexOf(channel) > -1 && socket.channel!=channel) {
                        socket.leave(socket.channel);
                        socket.join(channel);
                        socket.channel=channel;
                }
        });
});

setInterval(function () {
        mysqlConnection.query('SELECT 1');
}, 5000);

您需要在使用后关闭 mysql 连接。 基本上发生的事情是您不断进行这些查询并保持连接对象打开。连接可能会定期断开,但您的节点脚本仍在维护资源以保持连接打开并为后续连接创建新连接。这就是内存泄漏的来源。您应该始终为每个查询创建一个新连接,并在获得结果时关闭它。

var https = require('https');
var fs = require('fs');
var mysql = require('mysql');


var mysqlInfo;
mysqlInfo = {
  host     : 'localhost',
  user     : 'user',
  password : 'pass',
  database : 'user',
  charset  : 'utf8_general_ci'
};




var options = {
    key:    fs.readFileSync('ssl/server.key'),
    cert:   fs.readFileSync('ssl/server.crt'),
    ca:     fs.readFileSync('ssl/ca.crt')
};
var app = https.createServer(options);
io = require('socket.io').listen(app);
app.listen(3000);

var login_users = {};

var channels = ['english'];


io.on('connection', function(socket){
    setTimeout(function(){
            socket.emit('login', '');
    }, 1000);
    socket.join('english');
    socket.channel='english';
    socket.on('login', function(login){
        var login_json = JSON.parse(login);
        var mysqlConnection = mysql.createConnection(mysqlInfo);
        mysqlConnection.query("SELECT id FROM users WHERE id=? and token=?", [login_json.id,login_json.token], function(err, results) {
            if(results.length==1){
                    login_users[socket.id] = socket;
                    login_users[socket.id]["id"] = login_json.id;
                    login_users[socket.id]["token"] = login_json.token;
                    socket.join(login_json.id);
            }
            mysqlConnection.end()
        });
    });
    socket.on('chat', function(message){
        if(typeof socket.id !== 'undefined'){
            var mysqlConnection = mysql.createConnection(mysqlInfo);
            mysqlConnection.query("SELECT * FROM users WHERE id=? and token=?", [socket.id,socket.token], 
              function(err, results) {
                  mysqlConnection.end();
                  io.in(socket.channel).emit('chat', '{"message":"'+message+'"}');
              }
            });
        }
    });
    socket.on('channel_change', function(channel){
        if (channels.indexOf(channel) > -1 && socket.channel!=channel) {
                socket.leave(socket.channel);
                socket.join(channel);
                socket.channel=channel;
        }
    });
});