会话技术
一. 为什么使用会话技术
我们访问网站走的是HTTP协议,协议具有无连接无状态的特性,对事物的处理不具有记忆能力。
我们在web项目中,很多时候需要将会话数据记忆存储,以便后续的程序能够随时调用和使用。
我们需要通过会话技术解决以上问题。
二. 什么是会话技术
通俗的理解就是“唠嗑”;
概念
将数据持久化存储的一种技术。
分类
COOKIE技术 和 SESSION技术
三.COOKIE技术
COOKIE技术实际上指的就是:将数据持久化存储在浏览器端的一种技术。
COOKIE技术实现的基本原理
我们通过原理图可以了解到:
1, COOKIE数据存储在浏览器端(会话数据区);
2, 如果浏览器端已经存在了某台服务器的COOKIE数据,那么在接下来的所有请求中,都将携带上这些COOKIE数据一并传递到服务器端。
基本操作
COOKIE本质上就是数据,对数据的基本操作其实就是 增 删 改 查。
COOKIE的设置(增删改)
设置COOKIE需要注意:设置的COOKIE值只能是字符串,如果不是字符串,将会自动转换成字符串。
新增操作
通过函数setcookie来新增:setcookie(‘COOKIE名’,’COOKIE值’)
修改操作
通过setcookie函数来实现,名不变,值改变。
删除操作
通过setcookie函数来实现,名不变,值为空字符串。
COOKIE的查询操作
我们只需要通过$_COOKIE超全局预定义数组变量来查询即可。
COOKIE数据区和$_COOKIE变量之间的关系
通过分析关系原理图:
1, 每次请求后,在服务器端执行程序代码之前,都会将$_COOKIE变量初始化一次,如果没有携带COOKIE数据过来,$_COOKIE变量将被初始化为空数组;如果有携带COOKIE数据过来,$_COOKIE变量将会初始化为数组,携带来的COOKIE数据会成为其元素。
2, Setcookie并不是直接在程序中操作$_COOKIE变量的,setcookie只是负责在响应的时候告诉浏览器需要设置相应的COOKIE数据而已。
COOKIE数据的相关属性设置
Setcookie(名,值,有效期,有效路径,有效域,是否安全传输,HTTPONLY);
有效期
通过第三个参数来进行设置
不写或给0值为默认值,表示一个会话周期。
默认的一个会话周期表示从设置后到浏览器关闭为止。
注意:如果设置了过期时间,将以过期时间为销毁COOKIE数据的时间(7天免登录);如果没设置就按默认的一个会话周期走。
注意:我们可以通过设置一个过期了的时间,来达到删除一个COOKIE数据的目的。(重重点)
有效路径
通过设置第四个参数来设置。
不设置或者设置为空字符串表示默认情况。
默认情况为当前目录及其子目录下有效(“有效”二字表示能够访问的到)。
有效域
通过第五个参数来进行设置。
不设置或者设置为空字符串表示默认情况。
默认情况下COOKIE数据只有在当前域名下有效。
设置的域名为www.home.com
访问时的域名blog.home.com
是否安全传输
通过第六个参数来进行设置。
不填或者指定false为默认情况。
默认情况下,http和https都能访问得到。
如果设置为true,则只能在https下才能够访问。
HTTPONLY
我们一般情况下还可以通过js等一些脚本语言获得保存在浏览器端的COOKIE数据,
以下是通过javascript来获得COOKIE数据的案例:
通过第七个参数来进行设置。
不设置或者设置为false表示默认情况。
默认情况下,COOKIE数据能够被其他脚本语言获取。
如果我们设置为true,那么,表示只能通过http传输访问的方式获得。
我们设置HTTPONLY属性为true后,通过js代码获得COOKIE数据中,不包含我们设置为HTTPONLY的user4这条COOKIE记录。
如下图:
COOKIE技术的局限
1, 在安全性方面,因为COOKIE数据是存放在浏览器端的,不受服务器的限制和控制,所以安全性不高;
2, 如果COOKIE数据量比较庞大的时候,每次请求,都将携带上所有的这些COOKIE数据区请求服务器,将会占用大量的带宽,影响访问速度。
由此,我们需要一种技术来规避以上局限性,这个技术就是 SESSION技术。
四. SESSION技术
概念
将数据持久化存储在服务器端,并且能够是数据区分浏览器的一种技术。
基本操作
SESSION数据也是数据,对数据的操作就有 增 删 改 查。
开启SESSION机制
我们可以在代码中通过session_start函数来开启SESSION机制。
我们除了能在代码中直接开启SESSION机制以外,还能够通过修改php.ini中的session.auto_start配置项来开启SESSION机制。
如果在配置中开启的session.auto_start,则在代码中不需要通过session_start再次开启SESSION机制,否则报错。
TIPS:我们建议使用在代码中通过session_start的方式开启SESSION机制,不是每一个项目或者每一个页面都需要用到SESSION数据,我们的策略是,什么时候用到,就什么时候将它开启。
增删改查操作
对SESSION数据的增删改查操作,其实就只是对$_SESSION数组变量的增删改查操作,就像操作普通数组一样操作即可。
SESSION技术的原理
通过分析基本原理图:
1, 当我们首次访问服务器的时候,如果使用到了SESSION,服务器将会新开辟一个SESSION会话数据区,并且为这个数据区生成一个对应的口令(门牌号);
2, 生成的这个口令将会以COOKIE数据的形式存在。(SESSION技术实际上还是依赖于COOKIE技术来实现的)
SESSION数据区和$_SESSION变量之间的关系
通过分析关系原理图:
1, session_start时会将$_SESSION初始化一次,如果没有数据则初始化为空数组,如果有数据,则将数据赋值给$_SESSION数组变量作为其元素存在;
2, 程序中操作$_SESSION数组变量,并不是直接操作到了SESSION会话区,只是单纯的操作了$_SESSION这个数组;
3, 当程序运行结束时,才会将$_SESSION中的元素统一保存进SESSION会话区;
注意:SESSION技术的实现本质上还是依赖了COOKIE技术才实现的。
销毁SESSION(数据区)
我们可以通过session_destroy函数来销毁SESSION会话数据区。
TIPS:session_destroy函数只销毁SESSION数据区,不负责销毁$_SESSION变量,也不负责销毁PHPSESSID。
SESSION数据的属性控制
我们是通过控制PHPSESSID这条(特殊)COOKIE数据的属性来达到控制SESSION数据的属性的目的。
控制PHPSESSID的属性—》相当于控制住了整个SESSION会话数据区的属性—》就相当于控制住了整个SESSION会话区中所有SESSION数据的属性
那么既然PHPSESSID是一条COOKIE数据,那么他也具有COOKIE数据所具有的属性,只不过这个COOKIE数据是由系统来创建出来的,我们需要通过一些特殊的方式来达到控制其属性的目的。
有效期
PHPSESSID的有效期,默认情况为一个会话周期。
一个会话周期表示从设置到关闭浏览器为止。
有效路径
PHPSESSID的有效路径,默认情况为站点的根目录及其子目录下都有效。(这一点有别于普通的COOKIE数据)
有效域
PHPSESSID的有效域,默认情况为当前域名下有效。
是否安全传输
PHPSESSID的这个属性,默认情况为http和https下都能访问。
HTTPONLY
这个属性对PHPSESSID没有意义。
我们需要在php.ini文件中设置相应的配置项来控制PHPSESSID的属性。
我们在配置文件中进行配置,将会影响到服务器下所有的项目,不利于管理,所以,我们希望在什么时候用到就在什么时候进行设置。
TIPS:使用session_set_cookie_params函数必须在开启SESSION机制之前,第一个参数只需要指定多少秒以后过期的秒数即可。
案例:禁用COOKIE后如何使用SESSION
TIPS:如果use_only_cookies设置为1则use_trans_sid需要设置为0;如果use_only_cookies设置为0则use_trans_sid需要设置为1;
实现代码
Code17.php
Code18.php
SESSION的垃圾回收机制
我们可以通过SESSION的垃圾回收机制清理无效的SESSION数据区(空间)。
要想实现垃圾回收机制,需要通过配置php.ini中的相应参数来实现。
垃圾回收机制:如果gc_maxlifetime时间内,SESSION数据区没有被使用过,系统将会认为这个SESSION会话数据区已经失效,将会以一定的概率(gc_probability/gc_divisor)进行清除,