session:将会话数据存储在服务器端,并且让数据能够识别浏览器的一种技术。
原理图:
通过分析原理图:
1)会在服务器开辟SESSION会话数据区保存会话数据;
2)开辟会话数据区后,将会生成一个唯一的PHPSESSID,并且返回给浏览器作为一个COOKIE数据。
session的使用 -- 基本操作
1.要使用session,必须先开启SESSION机制,使用session_start()函数
#开启session session_start();
2.增删改查操作
我们可以通过操作$_SESSION数组变量来增删改查SESSION数据
我们还可以通过配置php.ini中session.auto_start配置项来开启SESSION机制。默认情况下,配置的值为0,表示不自动开启,我们可以修改为1,来开启自动开启SESSION机制。
(项目中不推荐使用这种方式,我们并不是所有程序页面都需要使用SESSION数据,什么时候需要就什么时候开启)
$_SESSION变量和SESSION会话数据区的关系
通过分析原理图:
1)会话数据存储在服务器的会话数据区中;
2)Session_start时,如果没有会话数据区将会开辟一个新的会话数据区;如果有,则找到该数据区,将其中的数据取出来初始化给$_SESSION变量。(没有的时候初始化为空数组)
3)只有当程序运行结束时,才会将$_SESSION中的数据保存到会话数据区。
4)我们程序将自动通过PHPSESSID区查找对应的会话数据区。
销毁SESSION数据(区)操作
session_destroy();
注意:session_destroy销毁的是SESSION会话数据区,并没有直接操作到$_SESSION。
SESSION属性的设置
本质上是控制PHPSESSID来达到控制整个SESSION会话数据区中所有会话数据的属性。
PHPSESSID不是我们手动创建的,而是PHP自动帮我们创建的,如果我们要修改PHPSESSID这条COOKIE数据的属性,我们需要通过PHP来进行相关的控制,而不是通过setcookie函数来进行相关的设置。
有效期
默认值为0,表示一个会话周期。
一个会话周期:表示到关闭浏览器为止为一个会话周期。
有效路径
区别于普通COOKIE数据,PHPSESSID默认的有效路径为全站有效。
有效域
默认的是当前域有效。
是否安全传输
默认的是http和https都能访问。
HTTPONLY
这个属性对SESSION数据无意义
对应的在php.ini中的配置项为,如下图:
1)我们通过直接配置,不方便(可能经常要找运维人员); 2)另一个也不符合我们个性化的管理(一台服务器可能部署多个网站,修改配置将会影响到所有网站)
所有PHP还支持我们在程序中自定义控制属性。通过函数session_set_cookie_params函数来进行设置。参数对应着PHPSESSID这个COOKIE的五个属性。
TIPS:这个函数在指定第一个有效期参数时,有可能需要在不同环境增加或者减少时间戳来测试,这个是该函数的一个小bug。
禁用COOKIE后如何使用SESSION
我们可以通过php.ini文件的相关配置来开启另一种使用SESSION的机制。
下面这个配置项默认的配置值为1,表示只适用COOKIE方式实现SESSION。
下面这个配置默认值为0,表示不允许通过传输的方式传递PHPSESSID的值。
我们可以将session.use_only_cookie设置为0并且将session.use_trans_sid为1实现禁用COOKIE后依然能够使用SESSION。
SESSION的垃圾回收机制
有时候,我们的PHPSESSID这个COOKIE消失以后,SESSION会话数据区依然存在。
PHP提供一个垃圾回收机制,专门针对清理这类型的无效数据区。
实现方式
我们需要在php.ini中进行相应的配置。
PHP将会根据gc_maxlifetime判断会话数据区是否已经失效(如果在这个指定的时间内这个会话数据区依然没有被访问过,那么PHP将认为这个会话数据区可能已经失效),如果失效,那么PHP将会以一个概率值来清除会话数据区,这个概率就是gc_probability除以gc_divisor!