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