需要实现共享session的原因就在于,多个网站要使用同一份session数据,例如保存用户登录状态的session
相关文章:
java:
https://www.cnblogs.com/SimpleWu/p/10118674.html
PHP使用Redis实现Session共享:
https://segmentfault.com/a/1190000019138919
PHP 实现多网站共享用户SESSION 数据解决方案:
https://blog.csdn.net/u013160024/article/details/47037445
PHP实现跨服务器session共享的方法教程:
https://www.cnblogs.com/furuihua/p/11468610.html
需要共用session数据的场景有哪些?
1、当服务器使用了负载均衡,多台服务器使用的都是同一套网站的代码,用户请求网站时,请求被分发到不同的服务器上。这种情况下,用户第一次请求时,在a服务器生成了sessionid,但在b服务器和c服务器并没有生成sessoinid,此时就会导致用户的登录状态出现问题,各服务器之间不能保持一致
2、当多个网站同一个服务器需要用同一个sessoinid来获取用户的登录状态时
sessoin共享的实现
session共享的情况有以下几种:
1、同服务器同域名(子域名不同):
如:a.baidu.com b.baidu.com c.baidu.com
2、同服务器不同域名
如 abc.now.com uj.after.com
3、不同服务器不同域名
第一种情况可以这样设置(如有侵权,请联系删除)
第二种情况和第三种情况比较类似,都需要做到sessionid共享和数据共享
sessionid共享可以通过跨域设置cookie来实现,如在a站登录时,设置b站的sessionid,并把sessionid当做key存入redis中,b站再通过该sessionid获取到共用的数据。但这种方式存在一种情况,就是当跨域设置b站的cookie失败时比较麻烦,因为在a站中是通过这种方式来设置b站的cookie的
数据共享可以通过将数据保存在redis、memcached、数据库来实现
session服务器共享
这个问题和cookie的跨域类似,面试的时候也很爱聊这个问题。
以前在做服务器集群的时候会碰到这样的一样问题,就是用户一会访问是处于正常登录状态,一会访问又没有登录了。这个问题偶尔才会出现。跟踪代码下去才发现session没有取到相应的值,想想也是醉了:原来服务器session没有设置共享,session存在在本地文件目录,当用户访问另外一台服务器的时候自然就取不到session了。
解决方法也不难,通过共享的存储在进行服务器之间的共享。这里使用redis的进行session存储。可以通过php.ini配置文件进行调整,也可以在代码中通过ini_set进行调整
ini_set("session.save_handler", "redis");
ini_set("session.save_path", "tcp://127.0.0.1:6379”);
如果需要使用redis进行存储,需要session中的Registered save handlers支持redis
php中session是否支持redis
当这样设置之后,session就会保存在redis中了,不同的集群服务器之间就可以通过该redis服务器进行共享了。