背景:
http的无状态特性, 导致了每一次请求都是相对独立的, 如果需要在这些请求间建立联系, 允许服务端对统一客户端发出的请求进行追踪, 就需要用到会话技术, 主要是使用cookie和 session两种方式
一.cookie
1.概念: 由服务器设置, 存放在客户端浏览器内的数据
2.设置: setcookie($name, $value, $expire, $path, $domain, $secure)
3.读取: $_COOKIE
4.删除: setcookie($name, $value, time()-1 ) //使cookie过期
5.存储数据类型: string
6.优点: 不占用服务器资源
7.缺点: 安全性低, 用户可以禁止使用cookie
二. session
1.概念: 存储在服务器端的会话信息
2.与cookie的关系: PHPSESSID 存储在cookie中, 凭借这个ID可以在服务端获取相应的数据
3.设置: $_SESSION[$key] = $value
4.读取: $_SESSION[$key]
5.删除: $_SESSION = []
6.销毁session文件 session_destroy
7.session的配置:
session.auto_start //自动开启
session.cookie_lifetime
session.cookie_path
session.cookie_domain
也可通过session_set_cookie_params实现
session.name 默认PHPSESSID
session.save_path session文件存储地址
8.session的垃圾回收
session.gc_probablity = 1 清理次数
session.gc_divisor = 100 session开启次数
session.gc_maxlifetime = 1440 过期时间
即每100次开启session, 就有1次, 会清理掉最后修改时间至今超过1440s的session文件
9.session
默认已文件存储 ,目前更常使用redis
①配置文件: session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?auth=myPass"
或代码中: ini_set("session.save_handler", "redis");
ini_set("session.save_path", "tcp://localhost:6379");
②实现 session_set_save_handler(
array($handler, 'open'), //开启session自动调用
array($handler, 'close'), //结束session自动调用
array($handler, 'read'), //读取session自动调用
array($handler, 'write'), //写入session自动调用
array($handler, 'destroy'), //销毁session自动调用
array($handler, 'gc') //触发垃圾回收自动调用
);
10.优点: 安全性高, 存储数据类型不受限, 存储数据量更多
11.缺点: 占用服务器资源