redis 代替 session 多服务器共享的方案梳理

  默认情况下,php的session文件是保存在磁盘文件中。在php.ini配置文件中的配置项如下


session.save_handler = files     // 配置项是指定使用files(文件形式)存储session数据。

session.save_path = "N;/path"   //。N表示生成多少级目录(不放到一个目录下,分散到多个磁盘目录中去)

session.save_path = "F:/wamp/tmp"。那么就会去这个目录下面看到很多session数据的文件。


当我们使用php的内置函数session_start()的时候,就是去上面指定的磁盘目录把session数据载入,实际上就是拿类似

sess_74dd7807n2mfml49a1i12hkc45的文件。

 

74dd7807n2mfml49a1i12hkc45就是大家经常说的什么session的id号。

session.name = PHPSESSID

PHPSESSID就是cookie的名称,其实上面一串"74dd7807n2mfml49a1i12hkc45"会保存在一个名为PHPSESSID的cookie中。

根据http的请求机制,当浏览器请求的时候,头部信息会把浏览器中的cookie一起发给服务器。PHPSESSID这个cookie也

是在其中发给了服务器,php引擎通过读取PHPSESSID的值来确定要载入哪个session文件。

比如值为74dd7807n2mfml49a1i12hkc45,载入的就是"sess_74dd7807n2mfml49a1i12hkc45"。


这个可以根据fiddler  抓包  或者   在 代码输出 PHPSESSID日志


问题一,,为什么要用redis 代替session (无聊 ?),,先看看图吧


根据如上原理。session的数据默认是保存在磁盘文件中。

假设这种情况:多台php服务器进行负载均衡的时候

,比如有三台php服务器,为了实现负载均衡,那么三台服务器上面的php代码都是一样(拷贝一份)。


生成session数据文件都是在本地了(a,b,c各自的服务器磁盘上)。

负载均衡的目的本来就是要为了平均分配请求,

所以没有固定第一次访问和第二次访问是同一台服务器,

实际上无法确定的。第一秒访问可能是a服务器,第二秒访问的可能是c服务器



竟然已经知道问题所在,,结合实际 解决办法

目前的 触屏网站   API   ios android




在API 的入口加入

ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://192.168.2.121:6379?auth=redis@123');


tcp 还有重要参数,,如,根据实际情况而定

//session.save_path = "tcp://192.168.2.121:6379?weight=1, tcp://host2:6379?weight=2&timeout=2.5, tcp://host3:6379?weight=2&persistent=1"


实现原理:

当a客户端请求的时候,原来生成在服务器的数据生成到浏览器的cookie中,根据cookie中的数据识别用户。php由原来的”从本地(也就是服务器)磁盘上读取session数据”转变为”浏览器的cookie中读取数据”,

这样子,在多台php服务器负载均衡的情况下,即便第一秒请求是a服务器,第二秒请求是b服务器,都不需要管哪台服务器了。反正都是读取客户端上的cookie数据。


上面的意思就是说 当触屏网站请求API 时,通过curl 协议把 session_id  加载到cookies   实现唯一标识且只有一个sessionid

这个就实现 session 唯一 PHPSESSIONID ,,当然,安卓和ios  也一样!!




sesseion  不是很清楚可以看看这里

 php中session的原理,以前做了一下总结,可以参考:http://www.cnblogs.com/wangtao_20/archive/2011/02/16/1955659.html



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值