### 2019 年 5 月 20 日 发布 最新的`6.0`版本对框架的`Session`和`Cookie`机制进行了重新设计,摆脱了原有设计的束缚。 ## Session 新的`Session`机制不依赖PHP内置的`Session`会话机制,完全独立实现,优势在于可以兼容任何的运行环境,而且配置参数也大为简化。 >[danger] 新版你不能再使用`$_SESSION`或者任何php内置的`session`函数操作`Session`,必须通过`think\Session`类或者`think\facade\Session`静态代理类操作`Session`数据。 `Session`对于很多API接口应用来说,不是必须的,而随着前后端分离的应用架构设计越来越多,因此`6.0`的`Session`默认是关闭的,系统把`Session`相关的功能设计成一个独立的中间件,如果你需要使用`Session`可以单独在应用的中间件定义文件中开启。 默认安装后,在`app`目录下的`middleware.php`中间件定义文件中,对可能需要使用的系统中间件预置了注释,你可以直接取消注释,加上: ``` // Session初始化 'think\\middleware\\SessionInit', ``` 该中间件的作用主要是初始化`SessionId`,并注入当前的请求对象。初始化的时候会自动读取`config`目录下的`session.php`配置。 默认使用文件的方式保存`Session`数据,支持使用`redis`、`memcache`以及`memcached`。 内置的`Session`驱动默认配置下,都是支持跨应用读取`Session`数据的。如果你需要区分不同的应用,保持各个应用的Session数据独立,可以在应用的`session`配置文件中设置`prefix`参数,例如: ``` 'prefix' => 'admin', ``` 并且为了防止`Session`数据过多,文件方式写入`Session`数据的时候支持垃圾回收机制。可以配置`gc_divisor`和`gc_maxlifetime`两个参数来设置GC回收。 `Session`数据会在当前请求结束后,自动写入,一般只会写入一次。`Session`数据写入之前会首先进行序列化,默认的序列化方法是`serialize`/`unserialize`,你可以在`session`配置文件中设置`serialize`参数(数组)来改变默认的序列化机制,例如: ``` 'serialize' => ['json_encode', 'json_decode'], ``` `Session`类本身的用法和之前版本基本一致,增加了`push`方法用于追加一个`session`数组。 ## Cookie `Cookie`的存取机制是分开设计的,读取操作是通过`$_COOKIE`读取,写入则通过可扩展的方式满足不同运行环境的`Cookie`写入要求。`Cookie`数据的写入操作也是在当前请求发送响应数据之前统一写入。 但在实际使用中,`Cookie`的用法和之前类似,区别在于不再支持前缀配置和清空操作。