session的流程:
(1)获取sessionId:从cookie中,传值中获取,或者重新设置新的值---------------SessionInit类
(2)初始化sessionId对应数据:根据sessionId从保存处获取数据---------------SessionInit类
(3)对session数据进行操作:对数据进行一些增删改查等操作---------------Store类
(4)保存session数据:将操作后的数据保存至相应的位置(文件或者缓存机制)----------------驱动类(File和Cache)
一、机制
(1)thinkphp6.0的session功能跟传统的session不一样,没有使用sessin_start和对应的$_SESSION,使用的是缓存机制来保存session;
(2)使用中间件模式进行session初始化(SessionInit类),在Http类中的run方法中,调用的方法runWithRequest中就有加载全局中间件的部分(loadMiddleware方法),从配置文件(app/middleware.php)中读取并加载至中间件中,就进入到中间件流程中了;
二、相关类
SessionInit类:中间件,session初始化类,有两个方法handle和end
handle:(Http类中的run方法,执行中间件加载类默认执行的方法)--------开始
(1)在$_REQUEST和Cookie中获取sessionId(从配置信息中获取数值对应的key值),如果sessionId为空,则设置一个新的值;
(2)初始化sessionId对应的数据;(最终调用Store类的init方法)
(3)分别设置请求类和响应类中的session变量
(4)将sessionId保存在cookie中
end:(Http类中的end方法中调用中间件类的end方法时,会调用每个加载类的end方法)--------结束
调用session类的save方法保存session数据(写入文件或缓存中),也就是调用魔术方法__call,最终调用的是Store类中的save方法
Session类:session管理类,也是继承于抽象类Manager类
createDriver:重写父类方法createDriver
(1)调用父类的createDriver方法,创建一个驱动实例
(2)驱动实例作为参数,创建一个Store类,并返回
驱动实例:对文件或缓存进行读取、写入和删除的操作,Store类:对数组进行的操作,最终再调用驱动实例中的方法将数组中的数据操作到最终的文件或缓存中
getConfig、resolveConfig和getDefaultDriver都是重写父类方法,并读取的配置中的数据
注意:最重要的魔术方法__call,所有对数据的操作,最终都委托给Store类的方法
Store类:session数据处理类
成员变量:
data:保存session数据
handler:驱动实例(File类或者Cache类)
init:是否初始化 name:session的name id:sessionId值 serialize:数值序列化和反序列化的方法名的数组
成员方法:
一些对数组data变量的一些操作方法:增删改查,判断是否存在,序列化,反序列化等
getId和setId方法:获取和设置sessionId(变量id的值);
clear:清空,只是对数值(data变量)的清空
destroy:销毁。除了清空数值,还销毁了sessionId,包括持久化的文件,并重新生成了新的sessionId
init:初始化数据(data),调用驱动实例handler从文件或者缓存中获取数据(read方法)
save:保存session数据(变量data),有值则调用驱动实例的write方法写入,没有则调用驱动实例的delete方法删除
两种驱动类:File类和Cache类,继承于接口类SessionHandlerInterface,三个接口:read、write和delete
File类:将session值保存至文件中
配置:
'path' => '',------文件路径
'expire' => 1440,------有效期
'prefix' => '',-------前缀
'data_compress' => false,---------是否对数据进行压缩(gzcompress和gzuncompress函数)
'gc_probability' => 1,----------垃圾回收,随机值不大于此值时进行垃圾回收,请求过期的session文件
'gc_divisor' => 100,----------垃圾回收,随机最大值
构造函数:初始化配置信息,特别是文件路径,检测并创建文件路径,随机处理垃圾回收(init方法)
init:检测并创建文件路径,随机处理垃圾回收
垃圾回收:(1)先在路径下找到所有已过期的文件;(2)删掉这些文件
read:获取文件路径,读取文件内容,判断是否压缩过,返回内容
write:获取文件路径,判断是否进行压缩,将内容写入文件
delete:获取文件路径,并删除对应文件
Cache类:用缓存机制将session值保存至对应的缓存中(根据缓存驱动)
三个成员变量:handler:缓存驱动,expire:有效期,prefix:前缀
构造函数:初始化三个成员变量,handler变量:调用缓存管理类的store方法来创建缓存驱动(驱动类型根据配置config/session.php中的store值)
read、write和delete:都是调用缓存驱动(handler)类的对应方法进行操作-------cache缓存机制
cache缓存:通过缓存管理类Cache进行数据的缓存操作
相关类:
Cache类:缓存管理类,继承于抽象类Manager,还有接口类CacheInterface
store:比较重要的方法,返回一个缓存驱动类,如果需要用到缓存驱动类时,可以通过这个方法传入参数生成相应驱动实例(如:session中用缓存机制保存session数据时)
有一些重写父类Manager的方法,还有一些是实现接口父类的方法,这些方法都是调用缓存驱动类的相应方法(操作委托给了驱动类)。
所有驱动类都继承于抽象类Driver,包括File类:缓存至文件,Redis类:缓存至redis服务器;Memcached类:缓存至memcached服务器等