cookie 和session 的区别
前言
HTTP是一种无状态的协议,为了分辨链接是谁发起的,需自己去解决这个问题。不然有些情况下即使是同一个网站每打开一个页面也都要登录一下。而Session和Cookie就是为解决这个问题而提出来的两个机制。
1.存储位置
cookie存储在客服端浏览器上
session存储在服务器上
2.安全性
cookie 由于是存储在浏览器上用户都看得到,所以不安全
session 存储在服务器安全性比较高
3、支持的数据类型
cookie 只支持字符串
session 支持所有数据类型,比较常见的有数组,对象
4、存储大小
cookie 默认是4kb,不建议存太多cookie
session 默认是没有限制的
5、失效时间
cookie 没有设置时间,浏览器关闭失效,设置了时间,有效期过后失效
session 浏览器关闭失效,session文件还存在
6、使用场景
根据cookie 和session 的安全性不同
将登录信息比较重要的信息用session存储
其他的不重要的如需保留可以使用cookie存储,如记录浏览历史
7、session 的GC机制
可通过php.ini 中三个配置项进行设置
session.gc_probability = 1
session.gc_divisor = 100
session.gc_maxlifetime = 1440
session.gc_divisor 与 session.gc_probability 合起来定义了在每个会话初始化时启动 gc(garbage collection 垃圾回收)进程的概率。此概率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每个请求中有 1% 的概率启动 gc 进程。session.gc_divisor 默认为 100。
session.gc_maxlifetime = 1440 结束会话(关闭浏览器)后,默认24分钟,如果没有人去访问这个session文件 ,则该session文件将会被视为“垃圾文件”,并且等待gc(垃圾回收)进程的调用的时候被清理掉
实例:
通过配置php.ini文件,修改以下几个信息:
- session.gc_maxlifetime = 60//当session文件在60s后还没有被访问的话,则该session文件将会被视为“垃圾文件”,并且等待gc(垃圾回收)进程的调用的时候被清理掉
- session.gc_probability = 100
- session.gc_divisor = 100
因为gc进程被调用的概率是通过gc_probability/gc_divisor 计算得来的,所以gc进程在每次执行session_start()函数的时候都会被调用到。
开启三个会话,则创建三个对应的session文件,当每个文件在60秒内都没被调用的话,就会被当成是“垃圾文件”,等到gc进程调用的时候,“垃圾文件”就会被“回收”,因为之前我已经通过修改php.ini配置文件,将gc被调用的概率改成百分百,所以接下来,如果我重新使用任何一个浏览器刷新下页面的时候,三个session文件,应该只剩下一个了