网络相关内容-Session与Cookie原理、共享问题

前言

之前,我们对session的理解只停留在使用session_start()上,然后获取其中保存的值。但如果不知道里面的机制,在开发中遇到了新问题,还是比较麻烦的。

session和cookie的存储

session一般保存在服务端文件中,php.ini中有个配置session.save_path = “D:\phpstudy_pro\Extensions\tmp\tmp”;这个里面填写的路径,将会使session文件保存在该路径下。session文件的命名格式是:“sess_[PHPSESSIONID的值]”。每一个文件,里面保存了一个会话数据。
cookie保存在客户端浏览器中

COOKIE工作原理

以用户登录来举例

  • 小明访问某一网站 liuyuanshan.top 的登录页面,此时通过浏览器发了一个http request请求,此时http header 头域的cookie值可以是空的
  • liuyuanshan.top 服务器收到这个请求,并接受了小明提交过来的登录数据,判断用户名和密码都正确,这个时候服务器会“种下一个cookie”一般是将小明的用户名发给客户端,通常是“set_cookie:session_id=123456;”这个字符串通过 http response返回给客户端(浏览器)
  • 浏览器收到http response返回来的信息发现cookie了,然后将该信息写入到浏览器的某个存储文件中去
  • 小明再次访问liuyuanshan.top 的其他页面时候,请求的http header中会带着这个cookie.
  • 服务器端程序会找cookie,并根据cookie取出客户端想要的信息返回给客户端

SESSION文件具体内容

这里涉及到了session在服务器存储后通过cookie方式与session建立会话
1、用户请求服务端程序login.php填写数据后提交
2、服务器收到提交的数据取得用户信息,将用户信息存入session,并将session_id通过cookie的形式发给客户端
3、客户端鉴session_id存入浏览器cookie文件
4、用户再次访问其他页面时,将有session_id的cookie通过header头发给服务端
5、服务端拿到session_id从session中取到用户信息并返回

session与cookie常面试问题

  • 怎么删除cookie?
    浏览器删除
    在这里插入图片描述

  • a.xx.com和b.xx.com 他们可以互相使用对方的cookie吗?
    只要两个项目使用的是同一台服务器即可

  • cookie存储的内容是安全的吗?
    不安全

  • session的有效期如何设置?
    由php.ini中的session配置决定(session.cookie_lifetime = 0 和 session.gc_maxlifetime = 1440)

  • 关闭客户端可以删除session或者是session失效吗?
    不能删除session,但可以使session失效,使其失效的原因是如果配置的sssion有效期是cookie随着浏览器关闭而失效

  • 如果浏览器不支持cookie,session能正常使用吗?
    可以,将session通过url传递

session共享方案

session复制

使用一些文件同步工具(linux下的rsync),当a服务器中的 session 数据有更改
的时候,就会把这些更改也同步到b,c服务器上去。通过复制的方式,最终a,b,
c各个服务器上都拷贝了一份 session 数据。
坏处
速度慢。复制数据会出现延迟。比如第一秒访问是a服务器,修改了session数据,
负载均衡,可能下一秒访问是b服务器,session数据如果没有被复制到b服务器,则
是读取不到session数据的,出现时间上的延迟。这种复制数据要消耗很多网络带宽
的。在实际中业界用得比较少。机器的数量越多,复制数据的性能损耗越大。不具备
高度扩展性。
复制session的方式,无论是网络带宽成本还是硬件开销上都很大的。

session存储客户端

把原来存储在服务器磁盘上的 session 数据存储到客户端的 cookie 中,一般是把
session 数据按照自己定义的加密规则,加密后后存在 cookie 中

好处

好处是服务器的压力减小了,因为 session 数据不存在服务器磁盘上。根本就不会出现
session 读取不到的问题

坏处
  • 网络请求占用很多。每次请求时,客户端都要通过 cookie 发送 session 数据给服务
  • 浏览器对 cookie 的大小存在限制。每个浏览器限制是不同的。
    Firefox 和 Safari 允许 cookie 多达4097个字节
    Opera 允许 cookie 多达4096个字节
    Internet Explorer 允许 cookie 多达4095个字节
  • 一般 session 中存的都是重要性数据(帐号、昵称、用户id等),会存在安全问题
  • 淘宝以前用过这种方式,把session数据存储到cookie中,根据cookie来识别用户

Session中间层

做一个中间层服务器,专门来存储所有访问涉及到的session。也就是所有的
session都存储在这里。服务器端统一从这里读取session数据。

关系型数据库做中间层

把以前存储在文件中的 session 数据存储到数据库中去,那么这样做,其实就不用
到php内置的session机制了(像session_start()之类的函数都不需要去用
了)。
从数据库拿session数据,约定什么情况下数据过期了然后自动清理,这里是指删
除数据库中的行。保存在文件中的时候,php有垃圾回收机制会去自动清理过期的
session文件。
有些做法跟这种思想是类似的:比如ecshop、phpcms是把session数据都存储在
数据库中去。服务端就是从数据库中拿session的数据。
坏处

  • 放在数据库里面,访问量小没有问题。大流量网站这么做,只会拖慢速度。因为得查
  • 询数据库,造成数据库压力大。高并发访问的情况下,会出现很大的性能问题。
  • 在线人数决定了其瓶颈,主要问题是影响性能。在线人数,因为登录的session数据
  • 存储在数据库中,只要是登录的用户就会涉及到频繁操作数据库。
  • 小网站,同时1-2万个人在线情况下。应该没什么问题。
    对于大访问量的网站,数据库存储session方法可行性有待商榷。
非关系型数据库做中间层(业界使用最多的方案-redis)

将 session 数据保存在 memcached , redis 之类内存数据库中,因为内存的数据
读取速度是很快的,与磁盘读取的速度不是一个数量级的, 所以性能很高,用户并
发量很大的时候尤其合适。而且方便统计在线人数,内存数据库系统能够控制内存
中的过期数据自动失效(刚好符合session过期需要)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值