我是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作为关键字。
希望它能有所帮助!