什么是Cookie

  HTTP协议是无状态协议,服务器本身无法判断用户身份,我们可以通过Cookie来跟踪用户状态,Cookie是一种在远程浏览器端存储数据并以此来跟踪和识别用户的机制。简单地说, Cookie是Web服务器暂时存储在用户硬盘上的一个文本文件,并随后被Web浏览器读取。一般情况下,Cookie通过HTTP headers从服务端返回到客户端。

  PHP通过setcookie函数进行Cookie的设置,任何从浏览器发回的Cookie,PHP都会自动的将他存储在$_COOKIE的全局变量之中,因此我们可以通过$_COOKIE['key']的形式来读取某个Cookie值。

  PHP中的Cookie具有非常广泛的使用,经常用来存储用户的登录信息,购物车等,且在使用会话Session时通常使用Cookie来存储会话id来识别用户,Cookie具备有效期,当有效期结束之后,Cookie会自动的从客户端删除。

 

Cookie的生命周期

  • 如果Cookie不设定时间,就表示它的生命周期为浏览器会话的期间,只要关闭浏览器,Cookie就会自动消失。这种Cookie被称为会话Cookie,一般不保存在硬盘上,而是保存在内存中。
  • 如果设置了过期时间,那么浏览器会把Cookie保存到硬盘中,再次打开浏览器时会依然有效,直到它的有效期超时。
  • 虽然Cookie可以长期保存在客户端浏览器中,但也不是一成不变的。因为浏览器最多允许存储300个 Cookie文件,而且每个Cookie文件支持最大容量为4KB;每个域名最多支持20个Cookie,如果达到限制时,浏览器会自动地随机删除Cookies。

 

什么是Session

  Session 译为“会话”,其本义是指有始有终的一系列动作/消息,如打电话时从拿起电话拨号到挂断电话这一系列过程可以称为一个Session。

  在计算机专业术语中, Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统所经过的时间。因此,,Session实际上是一个特定的时间概念。

 

Session的工作原理

  • 准备建立一个Session会话的时候,PHP会先查看请求中是否包含session_id,如果没有服务器会在自己的内存里创建一个随机且唯一的session_id。
  • 服务器会把这个session_id发送到浏览器保存,一般浏览器会把这个id保存在Cookie中。
  • 之后浏览器再去访问服务器时,都会携带这个在Cookie中存储的session_id,当关闭浏览器时,id会自动注销,重新打开登陆此页面,会再次生成一个随机且唯一的id。
  • 服务器可以通过session_id存放会话数据,这些数据时经过序列化后存放进去的,session_id就是Session存放数据的文件名。
  • 当浏览器访问服务器时,可以凭借自己的session_id到服务器中获取存放的信息。
  • 如果想销毁会话,可以删除会话中的数据,销毁会话文件。

 

Session的生命周期

  • 会话发起会生成一个session_id,默认浏览器关闭则id自动注销,重新打开浏览器会生成一个新的session_id。当然如果需要,可以通过Cookie来设置session_id的失效时间,以达到关闭浏览器后能找到原来session_id的目的。
  • Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。为防止内存溢出,服务器会定期检查Session的最后访问时间,如果这个时间超出Session设置的过期时间,服务器就会销毁这个Session,那么客户端即使把session_id又传上来,服务器也找不到它的Session了,只会再重新创建一个新的Session。

 

Session和Cookie的区别

  1. Cookie数据存放在客户端浏览器上,Session数据存放在服务器上。
  2. Cookie相对不是太安全,容易被盗用导致Cookie欺骗,考虑到安全应当使用Session。
  3. 单个Cookie文件支持最大容量为4KB,每个域名最多支持20个Cookie,如果达到限制时,浏览器会自动地随机删除Cookies。而Session则没有这方面的限制。
  4. Session是通过一个session_id进行用户识别,PHP默认情况下session_id是通过Cookie来保存的,因此从某种程度上来说,Session依赖于Cookie。但这不是绝对的,session_id也可以通过参数来实现,只要能将session_id传递到服务端进行识别的机制都可以使用Session。
  5. Cookie保存在客户端,不占用服务器资源。Session保存在服务器端,如果并发访问量太大,会消耗大量的内存。