我正在使用this memcached package并且我正在尝试从我的服务器获取数据,该数据存储我的PHP会话和memcache。每当有人进入我的网站时,一个值存储在变量$_SESSION["user"]
中(用于聊天),我希望获得与socket.io
一起使用的值(以定义谁在线并发送消息,无论服务器),因为如果我与server 2
相关联,server 1
上的任何人都无法在线看到我或向我发送消息,那么,我做了:
var express = require("express"),
app = express(),
http = require("http").Server(app),
io = require("socket.io")(http),
Memcached = require("memcached"),
users = {};
// app.use(express.static(__dirname + "/scripts"));
io.on("connection", function(socket) {
var mem = new Memcached("privateipofmymemcachedserver:11211");
mem.get("user", function(err, data) {
if(err) {
return console.error(err);
}
if(data === false) {
return console.error("Data no found!");
}
console.log("Data: " + data);
});
// From client, sended when $(document).ready()
socket.on("connected", function(data) {
socket.user = data.user;
if(!users[socket.user]) {
users[socket.user] = new Set();
}
users[socket.user].add(socket);
updateUsers();
});
// To update online users list
function updateUsers() {
io.emit("users", Object.keys(users));
}
});
var port = Number(process.env.PORT || 8000);
http.listen(port, function() {
console.log("Server running on 8000!");
});
但是,当我运行代码并转到控制台时,唯一返回的是:
Data: undefined
Data: undefined
Data: undefined
我该如何“修复”它?或者有没有更好的方法来做这个而不涉及PHP会话,只是与套接字本身及其功能?也许使用socket或express cookies?我还读到了Redis,如果它是一个不错的选择,我怎样才能调整我的代码来使用它呢?
答案 0 :(得分:1)
如果您正在使用弹性beantalk,请考虑在负载均衡器上启用粘性会话。这将解决您的问题。还有一种使用socket.io适配器执行此操作的方法,但似乎不再维护socket.io-memcached lib。如果您想使用adapter,建议您切换到Redis。 – mkhanoyan