TP6.0默认不自动调用session_start(),Session需显式启用或通过thinkSession类操作;配置必须在config/session.php中声明,运行时不可重置,且Redis驱动下需统一expire与php.ini的gc_maxlifetime。

ThinkPHP6.0 的 session_start() 不再自动调用
TP5.1 中,Session 在应用初始化阶段就由框架隐式启动;TP6.0 改为按需启动,默认不调用 session_start(),导致 $_SESSION 为空、Session::get() 返回 null 或空数组。
实操建议:
- 在需要使用 session 的控制器方法开头,显式调用
session_start()(仅限原生 PHP 方式);更推荐统一使用 TP6 的thinkSession类 - 确保
config/session.php中'type' => 'file'(或其他启用类型)且路径可写,否则会静默失败 - 若使用 CLI 或命令行任务,注意 session 默认被禁用,需手动启用:
ini_set('session.auto_start', '1')并确认 SAPI 环境支持
thinkSession 类行为变更:不再兼容 Session::init()
TP5.1 允许通过 Session::init($options) 动态覆盖配置;TP6.0 移除了该方法,所有 session 配置必须在 config/session.php 中声明,运行时不可重置。
常见错误现象:
- 升级后调用
Session::init(['prefix' => 'admin_'])报错Call to undefined method think\Session::init() - 多个模块共用 session 但 prefix 冲突,导致读取错乱
解决方式:
- 将不同业务的 session 前缀拆到独立配置文件(如
config/session_admin.php),并通过Session::macro()或自定义驱动隔离 - 改用
Session::use('admin')切换驱动实例(需提前注册命名驱动) - 避免在中间件或控制器中动态修改
session.name或session.cookie_path,这些必须在session.php中配置并重启 Web 服务生效
跨域/子域名下 SESSION_ID 无法传递的 Cookie 设置问题
TP6.0 默认将 session.cookie_domain 设为空字符串,导致子域名(如 api.example.com 和 www.example.com)间无法共享 session。而 TP5.1 默认适配了当前域名。
使用 Playwright 为 jimeng.jianying.com 管理浏览器会话,导入 cookies/localStorage 以自动化视频生成工作流,支持图片上传等功能
关键参数差异:
-
'domain' => ''(TP6 默认)→ 不发送 Domain 属性,浏览器按完整主机名匹配 -
'domain' => '.example.com'→ 显式设置才能跨子域共享 -
'secure' => false(开发环境)但部署 HTTPS 后未同步改为true,导致 cookie 被浏览器拒绝
检查步骤:
- 打开浏览器开发者工具 → Application → Cookies,确认
PHPSESSID的 Domain 是否符合预期 - 在
config/session.php中补全:'domain' => $_SERVER['HTTP_HOST'] === 'localhost' ? '' : '.example.com' - 若使用 Nginx 反向代理,还需确认是否透传了
Cookie头,以及是否误加了SameSite=Strict
Redis 驱动下 session.gc_maxlifetime 与 TTL 不一致
TP6.0 使用 Redis 存储 session 时,不再依赖 PHP 原生的 gc_maxlifetime 触发清理,而是完全交由 Redis 的 key 过期机制。但若配置中 'expire' => 3600 与 php.ini 中 session.gc_maxlifetime = 1440 不一致,会导致部分 session 提前丢失或长期残留。
典型表现:
- 用户登录后 24 分钟无操作即登出(受 php.ini 限制),但 Redis 中 key 还没过期
- 大量过期 key 残留,Redis 内存持续上涨
正确做法:
- 统一以
config/session.php中的'expire'为准,将其设为所需秒数(如7200) - 在 php.ini 中将
session.gc_maxlifetime设为相同值,避免原生 session 回退逻辑干扰 - Redis 驱动不支持
session.save_handler = redis的 ini 写法,必须使用 TP6 的redis类型,并确保'host'、'port'、'password'正确
TP6 的 session 机制更贴近 PSR-7 和现代容器设计,但代价是很多“默认能跑”的隐式行为被移除。最易忽略的是:配置变更后未清除旧 session 文件或 Redis 中残留的 prefix 冲突 key,导致新老 session 混用,问题难以复现。上线前务必清空存储并验证首次访问全流程。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










