一、PHP会话控制技术
1、为什么要使用会话控制技术?
因为http协议是无状态协议,所以同一个用户在请求同一个页面两次的时候,http协议不会认为这两次请求都来自于同一个用户,会把它们当做是两次请求的独立,如果用户已经执行了登录操作,再次请求页面,http协议不会认为该用户已经做过登录,那么会话控制技术就是为了解决这个问题。
2、实现方式
- 通过GET传参。
- 通过cookie存储。
- 通过session存储。
3、cookie
cookie是服务端发送给客户端的片段信息,存储在客户端浏览器的内存或者硬盘中的技术,可以把它当做浏览器中的一个小文件,这个小文件存存了客户端的一些信息
//设置cookie
setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path = "" [, string $domain = "" [, bool $secure = false [, bool $httponly = false ]]]]]] ) : bool
//删除cookie
setcookie($name,'', time()-1);
cookie的优缺点:
- 优点:存储在客户端,不会占用服务器资源。
- 缺点:不够安全,敏感信息不宜存入cookie,且用户可以设置禁用cookie
- 如果 cookie被禁用了,可以通过url传递SessionID,服务器会通过这个SessionID来找到对应的session
4、SESSION
session_start() ; //开启session
$_SESSION[$key] = $val //设置session
session_destory() //销毁session
session的相关配置
//是否要自动开启session
session.auto_start
//存储SessionID的cookie的有效域
session.cookie_domain
//客户端的cookie存储SessionID的有效时间,默认值0表示直到浏览器关闭
session.cookie_lifetime
//客户端的cookie存储SessionID的路径
session.cookie_path
//cookie中SessionID的名称,默认值是PHPSESSID
session.name
//session文件在服务中的存储路径
session.save_path
//是否使用cookie来传递SessionID
session.use_cookies
//是否使用传递的方式(即url)来传递SessionID
session.use_trans_sid
垃圾回收机制相关
//gc_probability/gc_divisor定义会话启动时垃圾回收启动的概率,gc_probability默认值为1,gc_divisor默认值为100,1/100意味着每个请求中有1/100的概率启动gc进程
session.gc_probability
// 默认值为 100
session.gc_divisor
//指定过了多少秒后,session数据就会被定义为垃圾进行回收。
session.gc_maxlifetime
//session的存储句柄,默认是files,可以把它定义为把session存储到redis,mysql之类的地方。
session.save_handler
session的优缺点
- 优点:安全
- 缺点:
- 会占用服务器的资源
- 分布式的时候,还是要借助redis之类来保持用户登录状态,否则多台服务器之间没办法共用session。
如何传递SessionID
<a href = "test.php?<?php echo session_name() . '=' . session_id() "?>
或
<a href = "test.php?<?php echo SID "?>
SESSION的存储(分布式)
假设我现在有5台服务器,用户通过第一台登录后,并将session保存到了第一台服务器,这是跳转到下一个页面的时候,假如轮询到第四台服务器,这时在第四台服务器上就找不到这个SessionID所对应的文件了,因为session文件是在第一台服务器里面存储着的。
解决方法:
不要在用文件的方式来存储,改用内存服务器,如 redis 来进行存储,甚至使用 msql数据库直接存储也可以。
// 设置用户自定义会话存储函数
session_set_save_handler()
本文为袋鼠学习中的总结,如有转载请注明出处:https://www.cnblogs.com/chrdai/p/11154583.html