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



我的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连接后,需要关闭它们。基本上,发生的事情是你不断地进行这些查询,并保持connections对象的打开状态。连接可能会定期断开,但节点脚本仍在维护资源以保持连接打开,并为后续连接创建新连接。这就是内存泄漏的来源。您应该始终为每个查询创建一个新的连接,并在得到结果时关闭它。

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;
        }
    });
});

最新更新