thinkphp6中使用session设置无效问题的解决及注意事项

ThinkPHP6 默认不开启Session,需在中间件配置中开启。使用Session类或助手函数操作Session,不支持原生$_SESSION。文中介绍了在中间件中初始化Session后仍无法保存数据的问题及解决方案,即需手动执行Session::save()来保存数据。此外,建议开发者不要轻易将稳定运行的项目升级到ThinkPHP6,因升级过程复杂,官方未提供自动化方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

就如thinkphp官方在文档开头所描述的一样,ThinkPHP6.0基于精简核心和统一用法两大原则在5.1的基础上对底层架构做了进一步的优化改进,并更加规范化;其实从5.x版本开始thinkphp本身就是为api应用而生。特别是在6.0版本开始框架默认压根不开启和提供模板引擎,需要下载安装模板引擎类库后方可开启。

新版本不支持操作原生$_SESSION数组和所有session_开头的函数,只能通过Session类(或者助手函数)来操作。因此,Session功能默认是没有开启的(API应用通常不需要使用Session)。甚至我们可以这样理解:在6.0版本中框架本身不提供session机制,而是通过think\facade\Session类来模拟实现session。

根据官方文档,默认session是不开启的,需要在全局的中间件中中开启;让人如果是多应用项目,仅仅想让session应用到某个应用,可以在对应的应用的中间件中开启。其中全局中间件配置文件位于app/middleware.php

实际上仅仅在中间件中进行session初始化是不行的,如写入测试代码:

session('key',1);
var_dump(session('key'));

这个时候页面会int(1),但刷新页面后重新使用session(‘key’)获取数据会发现NULL,也就是获取不到数据值。原因在于在上述处理后session的缓存数据并没有保存起来(类似你填写一个表单,没点提交,自然刷新后就没有了)。需要在执行设置session后,执行如下代码进行保存:

实际上仅仅在中间件中进行session初始化是不行的,如写入测试代码:

session('key',1);
\think\facade\Session::save();//这个不写也一样可以用,主要是要在中间件里开启

这样操作后,我们会发现在框架的runtime目录中,会出现一个对应的session缓存文件。

里面就包含了当前会话保存的两个session值,一个是上面演示的key,一个是另外写入的vcode。

现在在系统任何位置,执行session(‘key’)都能得到预期的数据。

相对于5.x版本,6.x版本的代码更加精简,剥离了很多功能模块,如果要使用这些功能模块,需要加载额外的类库或者自己接管相应的流程进行处理。所以,笔者不建议把已经稳定运行的项目升级为了thinkphp6.0版本,官方没有提供自动化升级方案,因为差别的东西还是比较多,仅仅提供了升级指导,很多流程需要手动去进行升级。网络服务部codeit.org.cn今年开始才在新项目使用6.0版本,后续如果有时间笔者会整理该项目升级到6.0版本过程中遇到的一些典型问题及其解决方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值