简述cookie和session的区别及各自的工作机制,存储位置等,简述cookie的优缺点 全

为什么要使用会话控制技术?
web是通过http协议来是实现的,http是无状态的协议,http没有一个内建机制来维护两个事务之间的状态,所以在同一个用户访问一个页面两次的时候,http协议不会认为这两次请求都来自同一个用户,会把他们当成两次请求的独立,会将这两次请求隔离开(不同的两个人过来请求),如果用户执行了登录之后呢,就会判断出这是同一个用户,

最简单的方式:通过GET参数传递,比如我在1这个页面进行一个登录,登录完之后,用户的登录信息我有了,跳到2页面的时候,继续把用户信息传过去,通过GET传参,问题:信息不安全,参数丢失,信息就丢失了.

cookie
由服务器发送给客户端的片段信息,在存储在客户端浏览器的内存,或者是硬盘当中的技术
存储在浏览器上的一个文件,这个文件包含客户 端的一些片段信息,单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

cookie操作
设置 :setcookie($name,$value,$expire,$path,$domian,$secure);  键  值 过期时间 路径 域名 安全性https传递
读取:$_COOKIE
设置数组:setcookie('a[b]','val');
删除cookie值:unset($_COOKIE);//不可以使用unset删除这个cookie
       setcookie($name,'',time()-1);//将它过期,即删除

优点:不占用我们服务器资源。不浪费服务器资源,效率会高一些
缺点:信息全部保存在客户端计算机,所以不建议将一些敏感重要的数据和信息保存在cookie当中,而且用户是有权限禁用cookie的使用,如果我们在浏览器将cookie禁止掉,我们没有办法保存我们的用户信息了。

session

将使用者相同的用户资料保存在服务器当中的,这样用户没有办法禁用掉session的使用,session并不是完全脱离cookie的,是基于cookie的;

eg:
用户(客户端)-》会员卡(只是电子卡,用户说身份证号就能使用)-》超市(服务器端)
身份证号就是session id ,这个是存储在cookie中的,cookie被禁用,可以通过URL来传递session id,保存一个session的状态,session的信息全部保存在服务器端文件中,当用户想要读取里边的内容时,首先会使用浏览器携带的session id的cookie去找到对应的那个session文件,进行读取。


session操作:
开启:session_start();
读取:$_SESSION;
数组:$_SESSION=[];
删除:session session_destroy();
配置session:    
session.auto_start 是否自动开启session
session.cookie_domian 存储session id那个cookie他有效域名是什么
session.cookie_lifestyle
session.cookie_path
session.name 默认PHPSESSION
session.save_path session文件在服务器中存在那个路径下
session.use_cookies 是否使用cookie传递我们是session id
session.use_trans_sid 是否使用trans传递我们是session id

(每100次调用session_start时,进行1次清除文件,当前时间的时间戳加-文件最后修改的时间>1440s)
session.gc_probability =1 垃圾回收机制
session.gc_divisor =100 //每访问一百次,有一次清除的机会
session.gc_maxlifetime =1440 (默认)//最大生命周期 ,
(一般的这三者配合去使用,做一个垃圾回收机制,用户直接关闭浏览器,不退出,会永久的保存在服务器中,使用垃圾回收,定时清除一些session文件,最大生命周期,过期,清除掉)

session.save_handler(缓存)

优点:存储在服务器端,数据信息安全;
缺点:占用服务器资源,分布式也是一个问题,n台web服务器,session存在其中一台,另外一台是无法使用的,使用redis,不管在那台,直接调用redis服务器,信息可以进行共享。

传递SessionID问题:
session_name()和session_id();
<a herf='1.php'?<?php echo session_name().'='.session_id?>下一个页面</a>
<a herf='1.php'?<?php echo SID;?>下一个页面</a>开启了cookie 这个SID就是空,没有开启cookie或者cookie被禁用掉,此时SID才是这个字符串的拼接,所以说提示比较智能的。


session储存
假如存在5台web服务器

  1     2     3     4     5
  session

     login

           lvs


用户在第一台服务器上进行了一个login,将session文件存储在第一台web服务器上边,
当用户在进行其他操作的时候,刚好轮询到其他的服务器上,没有session文件,用户登录的一个状态就丢失了

所以不要再存在文件中了,存在内存服务器或者数据库里面,例如redis,memcache,mysql

              redis
            session

    1     2     3     4     5


              lvs
直接调用redis服务器,获取信息

使用session_set_save_handler()

Session信息的存储方式,如何进行遍历?
默认存储在服务器文件中,还可以存储在数据库,内存,遍历$_session[]

猜你喜欢

转载自www.cnblogs.com/wzjia/p/10819366.html
今日推荐