PHP多台服务器跨域SESSION共享_Memcache分布式SESSION共享
网站业务规模和访问量的逐步发展、原本由单台服务器、单个域名的迷你网站架构已经无法满足发展需要、此时我们可能会购买更多服务器、并且启用多个二级子域名以频道化的方式、根据业务功能将网站分布部署在独立的服务器上;或通过负载均衡技术 (如:DNS轮询、Radware、F5、LVS等)让多个频道共享一组服务器
OK、头脑中我们已经构思了这样的解决方案、不过进入深入开发后新的技术问题又随之而来
我们把网站程序分布部署到多台服务器上、而且独立为几个二级域名、由于Session受实现原理的局限(PHP中Session默认以文件的形 式保 存在本地服务器的硬盘)、使得我们的网站用户不得不经常在几个频道间来回输入用户名、密码登入、导致用户体验大打折扣
另外、原本程序可以直接从用户 Session变量中读取的资料(如:昵称、积分、登入时间等)、因为无法跨服务器同步更新Session变量、迫使开发人员必须实时读写数据库、从而增 加了数据库的负担
于是、解决网站跨服务器之间的Session共享方案需求变得迫切起来、最终催生了多种解决方案、下面列举4种较为可行的方案进行对比探讨:
1、基于NFS的Session共享
NFS是Net FileSystem的简称、最早由Sun公司为解决Unix网络主机间的目录共享而研发
这个方案实现最为简单、无需做过多的二次开发、仅需将共享目录服务器mount到各频道服务器的本地session目录即可、缺点是NFS依托 于复 杂的安全机制和文件系统、因此并发效率不高、尤其对于session这类高并发读写的小文件、 会由于共享目录服务器的io-wait过高、最终拖累前端WEB应用程序的执行效率
2、基于数据库的Session共享
首选当然是大名鼎鼎的Mysql数据库、并且建议使用内存表Heap、提高session操作的读写效率、这个方案的实用性比较强、相信大家普 遍在 使用、它的缺点在于session的并发读写能力取决于Mysql数据库的性能、同时需要自己实现session淘汰逻辑、以便定时从数据表中更新、删除 session记录、当并发过高时容易出现表锁、虽然我们可以选择行级锁的表引擎、但不得不否认使用数据库存储Session还是有些杀鸡用牛刀的架势
3、基于Cookie的Session共享
这个方案我们可能比较陌生、但它在大型网站中还是比较普遍被使用、原理是将全站用户的Session信息加密、序列化后以Cookie的方式、 统一 种植在根域名下(如:.host.com)、利用浏览器访问该根域名下的所有二级域名站点时、会传递与之域名对应的所有Cookie内容的特性、从而实现 用户的Cookie化Session 在多服务间的共享访问
这个方案的优点无需额外的服务器资源;缺点是由于受http协议头信心长度的限制、仅能够存储小部分的用户信息、同时Cookie化的 Session内容需要进行安全加解密(如:采用DES、RSA等进行明文加解密;再由MD5、SHA-1等算法进行防伪认证)、另外它也会占用一定的带 宽资源、因为浏览器会在请求当前域名下任何资源时将本地Cookie附加在http头中传递到服务器
4、基于Memcache/Redis的Session共享
Memcache由于是一款基于Libevent多路异步I/O技术的内存共享系统、简单的Key Value数据存储模式使得代码逻辑小巧高效、因此在并发处理能力上占据了绝对优势、目前本人所经历的项目达到2000/秒 平均查询、并且服务器CPU消耗依然不到10%
另外值得一提的是Memcache的内存hash表所特有的Expires数据过期淘汰机制、正好和Session的过期机制不谋而合、降低了 过期Session数据删除的代码复杂度、对比“基于数据库的存储方案”、仅这块逻辑就给数据表产生巨大的查询压力
基于Memcache 的存储是这几个方案中推荐选用的!其它方案依然有其使用的场合、具体选用哪套需要开发人员的根据当前的服务器资源、网站并发压力等综合评估
推荐阅读
-
php中http与https跨域共享session的解决方法
-
PHP实现cookie跨域session共享的方法分析
-
PHP简单实现HTTP和HTTPS跨域共享session解决办法
-
php中http与https跨域共享session的解决方法
-
php使用memcache实现多服务器共享session
-
PHP兑现多服务器session共享之memcache共享
-
php中http与https跨域共享session的解决方法,httpssession
-
PHP简单实现HTTP和HTTPS跨域共享session解决办法_php实例
-
PHP实现cookie跨域session共享的方法分析
-
PHP兑现多服务器session共享之memcache共享