静态缓存不能用于缓存用户登录状态,因其面向匿名公共页面;登录态应由redis托管session实现,并需校验ip、user-agent等多维信息,推荐用redis hash优化字段级更新。

用 Redis 托管 Session,而不是静态 HTML
ThinkPHP 6.1 默认 Session 存在 PHP 文件或内存里,不可靠、难共享、无法校验 IP 或主动失效。必须切换为 Redis 驱动:
- 安装 phpredis 扩展(不是 Predis),执行
php -m | grep redis确认输出含redis - 在
config/session.php中设:'type' => 'redis',并配置'redis' => [...]子数组,包含 host/port/password/database - 务必显式设置
'password' => null(即使为空),不可留空字符串 - 关闭 PHP 原生会话机制:确保
session.use_trans_sid = 0和session.auto_start = 0(在 php.ini 或运行时禁用)
登录态校验要带上下文,不能只靠 token
光存 session_id 不够安全。每次请求需校验多维信息,避免 token 泄露或盗用后长期有效:
- 登录成功后,写入 Redis 的 session 数据里应包含:
user_id、login_ip、user_agent_hash、expire_time - 中间件中读取 session 前,必须比对当前请求的
$request->ip()和存储的login_ip,不一致则拒绝并清理缓存 - 登出操作必须调用
Session::destroy(),并手动Cache::delete('sess:'.$sessionId),防止 key 残留
进阶:用 Redis Hash 实现字段级更新(推荐)
默认 Redis Session 用 STRING 存整个序列化数据,改一次 last_login_time 就得全量读写。换成 HASH 可单独更新字段,更高效也更可控:
- 创建自定义驱动
app/extend/Driver/Session/RedisHash.php,重写write/read/destroy方法,用hSet、hGet操作sess:xxx这个 hash key - 在
config/session.php中设'type' => 'redis_hash' - 这样后续就能原子更新
last_access_time或标记is_kicked_out=1,无需反序列化整段数据
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











