0

0

Laravel如何判断用户是否在线?(实时状态)

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-03-11 09:16:03

|

748人浏览过

|

来源于php中文网

原创

在线判断需结合last_activity字段与心跳机制:后端在中间件中按最小间隔更新时间戳,前端定时发送认证心跳,数据库统一utc存储并加索引,高并发时缓存结果,强实时场景需websocket探活,且须明确定义“在线”业务含义。

laravel如何判断用户是否在线?(实时状态)

last_activity 字段 + 心跳更新判断是否在线

Laravel 自带的 users 表里有 last_activity(或类似字段),但默认不存、也不自动更新。得自己加逻辑:用户每次有效请求(比如访问需登录的页面、调接口)时,更新这个时间戳。

常见错误是只在登录时写一次,之后就不管了——结果用户开着页面半小时没操作,系统还显示“在线”。

  • 推荐在中间件里统一更新,比如新建 UpdateLastActivity 中间件,注册到 web
  • 别用 touch() 直接更新整个模型,避免触发不必要的事件或监听器
  • 更新语句建议用 DB::table('users')->where('id', auth()->id())->update(['last_activity' => now()]),轻量且可控
  • 注意并发:如果用户高频刷新或多个标签页同时发请求,不用锁表,但要避免频繁写磁盘,可考虑加个 30 秒最小间隔(缓存上次更新时间做判断)

前端定时发心跳,避免假离线

光靠后端请求更新不够——用户可能停留在某个页面不动,但浏览器还在运行。这时候得靠前端主动“报活”。

典型场景:后台管理页、聊天面板、协作编辑工具。不发心跳,5 分钟后用户就被标为离线,其实人还在盯着屏幕。

  • setInterval(() => axios.post('/api/heartbeat'), 60000),每分钟打一次,比 session 过期时间短即可
  • 心跳接口必须走 auth:sanctum 或对应 guard,否则未登录用户也能刷 last_activity
  • 别在 beforeunload 里发异步请求——浏览器可能直接关掉,发不出去;真要清理,用 navigator.sendBeacon 发个同步标记
  • 移动端要注意:WebView 或 PWA 可能被系统休眠,心跳会断,得配合后台长连接兜底(见下一条)

数据库查“最近 X 分钟活跃”要小心时区和索引

判断是否在线,本质就是查 last_activity > now() - X minutes。但 Laravel 的 now() 是 PHP 时区,MySQL 默认用系统时区,两边不一致会导致误判。

比如 PHP 设了 Asia/Shanghai,MySQL 用 UTC,那查出来的“5 分钟内”实际是错的。

  • 统一用 UTC 存储 last_activity,PHP 写入前转成 UTC:now()->utc(),查询也用 UTC 时间比较
  • last_activity 字段必须加索引,否则用户一多,WHERE last_activity > ? 就变全表扫描
  • 别用 User::where('last_activity', '>', now()->subMinutes(5))->get() 直接查全部——改成 select id, name, last_activity 只取必要字段,减少内存和网络开销
  • 如果并发查在线人数高(比如万人级实时看板),考虑把结果缓存 10 秒,用 Cache::remember('online_count', 10, fn() => ...)

WebSocket 不是必须,但复杂场景绕不开

纯 HTTP 心跳撑不住强实时要求:比如 IM 消息送达回执、协作文档光标同步、在线人数秒级刷新。这时候 HTTP 延迟+重试机制会让状态滞后 2~5 秒。

容易被忽略的是:WebSocket 连接建立后,服务端并不知道客户端是否真的“活着”——网络闪断、手机锁屏、浏览器挂起都可能导致连接假连。

  • 用 Laravel WebSockets 或 Soketi 时,务必开启 ping_intervalpong_timeout,让服务端主动探活
  • 客户端收到 ping 后必须立刻回 pong,不能等 JS 主线程空闲——要用 websocket.onping = () => websocket.pong() 这类底层钩子
  • 别把 WebSocket 连接状态和数据库 last_activity 混为一谈:前者反映“此刻 TCP 是否通”,后者反映“最近一次业务动作”,两者要分开维护、按需合并
  • 上线前压测真实弱网环境(比如用 Chrome DevTools 的 “Slow 3G” + 随机断连),光本地跑通没用

实际最难的不是写代码,是定义“在线”本身——是 TCP 连着就算?还是得有鼠标移动?不同业务答案不同。先想清楚这个,再选技术方案。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

339

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

293

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

772

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

385

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

140

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

85

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

79

2025.08.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

392

2026.03.04

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号