怎样在多台Web服务器上共享Session

在多台web服务器上共享session的问题,咱们能够举一些案例来讲明。好比:如今有三台php服务器,且实现了负载均衡,如何让这三台web服务器共享session数据?
session数据默认是以文件的形式保存在web服务器的磁盘上,通常都是用户登陆成功的时候,保存session数据。
同一个用户登陆后,就会将session保存在某个web服务器上,假设是保存在服务器A上,该用户访问网站的其余页面时,可能请求的就是服务器B或服务器C,但服务器B或服务器C上并无该用户的session文件,这样,就会致使网站误认为该用户未登陆,用户的登陆状态丢失的问题。
归根结底,就是要解决多台web服务器共享session的问题,尚学堂陈老师为咱们简要总结了三种方法:php

1、将本该保存在web服务器磁盘上的session数据保存到cookie中
即用cookie会话机制替代session会话机制,将session数据保存到客户端浏览器的cookie中,这样同一个用户访问同一网站时,不管负载均衡到哪台web服务器,都不用再去服务器请求session数据,而直接获取客户端cookie中的session数据。如此,同一个用户的登陆状态就不会丢失了。
但这样作,有三大弊端:
把session数据放到客户端的cookie中,通常都是重要数据(如用户id、昵称等),会存在安全问题,但能够将session数据加密后,再存放到cookie中,来下降安全风险。
浏览器对单个cookie的数据量大小限制为4K左右,所以会存在数据量的限制问题。
影响带宽性能,下降了页面的访问速度。在高访问量的状况下,用户每次请求时,都要将客户端cookie中的session数据发送到服务器,要占用较多的带宽,进而影响访问速度,服务器带宽成本增高。web

2、将本该保存在web服务器磁盘上的session数据保存到MySQL数据库中
sessionid仍是利用cookie机制存储到客户端,但session数据却存放在MySQL服务器上。(须要创建sessionid和session数据行的对应关系)
但这样作,只适合访问量比较小的网站。若是网站的访问量比较大,对MySQL服务器会形成很大压力。由于每次用户请求页面(即便是刷新页面)都要查询MySQL数据库中的session数据表,进而判断用户的登陆状态和读取用户相关信息,势必会对数据库服务器形成很大压力,这样就会下降服务器的响应速度,影响用户体验。redis

3、将本该保存在web服务器磁盘上的session数据保存到内存数据库(memcache或redis)中
memcache或redis是基于内存存储数据的,性能很高,尤为是高并发的状况下尤其合适。主要是由于从内存中读取数据要比从磁盘读取数据快不少。
内存数据库还支持数据过时失效的机制,正好与session的过时机制对应,推荐使用redis内存数据库,由于它比memcache支持更多的
数据类型,且支持内存数据备份到磁盘。数据库

这里简单说一下,后面两种方法的注意要点:
若是多台web服务器对应的是不一样的域名,为了保证cookie的惟一(同一个cookie在各个域名有效),须要修改php.ini文件中的session.cookie_domain
因为后面两种方法,属于用户自定义的方式管理session,而非默认的文件处理方式,故需修改php.ini中的session.save_handler=user
在开启session以前(即调用session_start()以前),须要先调用session_set_save_handler,关于session_set_save_handler的具体用法,请参考php手册。
 浏览器

相关文章
相关标签/搜索