session共享

1. 为什么要使用Session共享

1、负载均衡通过前面的负载均衡可以知道我们做负载是将用户的请求分发到不同的服务器上而我们存session默认会存到本地那我们在其他服务器上是读取不到session的这样造成的结果就是你已经在A服务器上登录了当你再下一步操作时将你的请求发送给了B服务器那你仍然处在未登录状态。。

2、单点登录因为同一台电脑上每个浏览器请求服务器生成的sessionid不同这样你在A浏览器登录了B的时候还是需要登录但是这样会很麻烦换个浏览器就要重新登录如果要实现两个浏览器同时处在登录状态那就需要session共享 

2. 了解session工作原理

在解决问题之前先来了解一下 PHP SESSION 的工作原理在客户端如浏览器登录网站时被访问的 PHP 页面可以使用 session_start() 打开 SESSION这样就会产生客户端的唯一标识 SESSION ID ID 可通过函数 session_id() 获取/设置)。SESSION ID 可以通过两种方式保留在客户端使得请求不同的页面时PHP 程序可以获知客户端的 SESSION ID一种是将 SESSION ID 自动加入到 GET  URL                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 或者 POST 的表单中默认情况下变量名为 PHPSESSID另一种是通过 COOKIE SESSION ID 保存在 COOKIE 默认情况下这个 COOKIE 的名字为 PHPSESSID这里我们主要以 COOKIE 方式进行说明因为应用比较广泛

服务端通过客户端传递的session_id区分用户用来标记用户的登录状态

 

 

用户再次发送请求的时候把服务端返回的session_id通过cookie[或者URL传参]的形式传递到服务端这样服务端就可以区分出来具体操作的用户

 

3. 如何解决负载均衡之后的session共享问题

1. 不使用session换作cookie

session改成cookie就能避开session的一些弊端。【安全性较低

浏览器对session存在大小不同Safari 4097字节 苹果浏览器包括名值和等号

Firefox 4097

O允许cookies最大长度 4096字节

IE允许cookies最大长度 4095字节

谷歌允许cookies最大长度

2. 数据库记录session信息

使用数据库记录session信息session的使用频率比较高如果存在数据库中频繁的读取会对数据库产生较大的压力网站性能瓶颈一般都存在数据库

3. 负载均衡的时候使用ip_hash算法进行分发

使用ip_hash可能会导致某一台服务器负载较大如果某段时间内服务器进入了很多固定IP代理的请求[翻墙代理] 如果代理IP的负载过高就会导致ip_hash对应的服务器负载压力过大这样ip_hash就失去了负载均衡的作用了

4. session文件进行同步

使用同步工具对session文件进行同步保证负载服务器的session文件都是一致的这种做法虽然可以解决session共享的问题同样的内容会存在多个服务器上而且部分服务器存在的session文件可能从开始到结束完全没有使用到浪费了服务器的资源 rsyncinotify-tools等

5. 使用memcache或者redis保存session信息 [建议]

相比文件取信息从内存取数据速度要快很多而且在多个服务器需要共用 session 时会比较方便将这些服务器都配置成使用同一组 memcached 服务器就可以减少了额外的工作量其缺点是 session 数据都保存在 memory 一旦宕机数据将会丢失但对 session 数据来说并不是严重的问题

实现

1. session存cookies(setcookie(1,2,3,4,5,6))

利用cookies跨域跨域是cookies中比较热门的问题如果是同一个主域比较简单可以通过setsession中的domain参数设置一个主域一下的子级域名都可以用

2. session入库

原理我们要实现在一台服务器1session在另一台服务器2也可以得到session值因为服务器2没有session存储的文件所以可以将它入库服务器1将数据存到数据库服务器也连接同一个数据库这样服务器2就可以取到它的值

步骤首先要改变session的存储方式可以在php.ini中将session.save_handler = user,也可以用ini_set('session.save_handler','user')来修改Session入库需要一个函数session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc');

其中open方法是会用到read方法读取是用一些其他方法也和它的名字对应方法名可以随意注意在每一个需要session的页面都要加载session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc');这个函数所以将它写在单独的文件里直接incude()包含它

3. session存入redis或memcache

session存入redis同样的需要修改存储机制也是两种方法第一个该配置文件第二个则是利用函数

ini_set('session.save_handler','redis');

设置存储方式为redis

ini_set('session.save_path','tcp://192.168.1.19:6379');

存储路径为redis服务器的ip后面是端口号

取值的时候也是一样的设置

Memcache同理

4、session文件进行同步

使用文件同步rsync

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值