Node.js-Redis-PHP:刷新并退出浏览器之间关闭错误的房间


Node.js - Redis - PHP : refresh and quit between browsers close the wrong room

我是stakoverflow的新手,但我发誓在问这里之前我真的搜索了很多。简言之,我打开了两个浏览器和两个PHP会话,redis负责处理会话,但当我尝试刷新页面时,刷新node.js服务器的在线用户会获取刷新后的页面的(可能是socket id?(,如果我在未刷新的页面上注销,则连接将作为刷新后的连接关闭。

我知道,这里很乱。我必须设置一个套接字id数组和会话吗?目前,我将每个新连接存储在一个房间里(以便有私人插座(,但我开始认为,也许我必须更改一些东西才能使所有连接正常工作。

如何处理刷新的页面?此外,因为可能发生的情况是,用户打开同一网站的另一个选项卡,或者朋友提供了一个链接,而您访问了该链接,并且您需要会话id(好(、保存的用户(好(和套接字io套接字(在我的情况下错了?(。也许是因为我不知道如何获得之外的cookie

socket.on('connection', function(client) {
    cookieManager = new co.cookie(client.request.headers.cookie);
    clientSession.get("sessions/"+cookieManager.get("PHPSESSID"), function(error, result) {
        if (error) {
            console.log("error : "+error);
        }
        if (result != "") {
        // if (result.toString() != "") {
            console.log("PHP session id: " + cookieManager.get("PHPSESSID"));
            //console.log(result.toString());
            //console.log("print result: " + result); //warning! this will parse entire session, test only!
            userData = JSON.parse(result);
        }
    }
}

默认情况下,nodejs服务器不会发回php cookie。

当我使用php+redis+socket.io时,我使用了这个答案中的配置:这里(编辑:我使用了memcache&一个自定义类,现在我使用redis+publish/subscribe来广播事件!(

为了连接,我从页面中读取带有javascript的cookie,并在连接开始时发送它。

 /** C "cookie" function, gets the cookie string.
  * @param {string} [k] - key, the cookie to get
  */
function C(k){return(document.cookie.match('(^|; )'+k+'=([^;]*)')||0)[2]}
s = io.connect("//io."+ window.location.host +"/", {query: "id=" + C('PHPSESSID')});

来自nodejs端:

io.sockets.on("connection", function (socket) {
var cookie = socket.handshake.query.id;
...
});

我将json格式的数据存储在redis数据库中,并将phpsessiond作为关键字。

希望它能有所帮助!