thinkphp6.x实时通知核心是启用swoole扩展并安装think-swoole包,配置swoole.php开启websocket、指定处理器类与路由文件,创建wshandler类处理连接/消息/关闭事件,定义websocket.php映射消息类型,cli启动服务。

ThinkPHP6.x 实时通知的核心,是用 Swoole 启动一个独立常驻的 WebSocket 服务,绕过 PHP-FPM 的短生命周期限制,让连接真正“活”着。不是在控制器里 new 一个 Server,而是通过 think-swoole 扩展注册监听器,在 onMessage 中完成消息分发逻辑。
必须启用 Swoole 并安装 think-swoole
Swoole 是底层支撑,think-swoole 是 ThinkPHP6 的官方适配层,缺一不可。
- 运行 php -m | grep swoole 确认扩展已加载;未出现则需执行 pecl install swoole,并在 php.ini 中添加 extension=swoole,重启 PHP 服务
- 项目根目录执行 composer require topthink/think-swoole:^4.0,确保与 TP6.x 兼容
- 避免使用 composer require swoole/swoole —— 这是社区非官方包,不兼容 think-swoole 的事件调度机制
正确配置 swoole.php 启用 WebSocket 模式
该文件是服务启动的“开关”和“路由中枢”,配置错误会导致握手失败或静默无响应。
- 设置 'type' => 'websocket'(不是 http 或 mixed)
- 开启 'websocket' => ['enabled' => true]
- 指定处理器类:'handler' => \app\listener\WsHandler::class,该类必须继承 \think\swoole\WebSocket
- 声明路由文件路径:'route_file' => app_path() . 'websocket.php',路径必须真实存在且可读
实现可靠的连接管理与广播逻辑
实时通知是否稳定,关键不在“发”,而在“连得稳、识得清、推得准”。
- 在 onOpen 中记录连接日志,并校验用户身份(如解析 token 获取 user_id),失败立即 $server->close($fd)
- 用 Redis 存储 user_id → [fd1, fd2] 映射,支持多端登录、踢下线、定向推送
- 广播前遍历 $server->connections,对每个 $fd 调用 $server->isEstablished($fd) 判断连接有效性
- 心跳配置建议设为 'heartbeat_idle_time'=>300, 'heartbeat_check_interval'=>60,防止 NAT 超时断连
启动与调试要点
服务必须以 CLI 方式常驻运行,不能走 Web 请求入口。
- 启动命令统一用 php think swoole:start 或 php think swoole:server,不要写自定义 start_websocket.php
- 前端连接地址格式为 ws://your-domain.com:9502(端口需与 swoole.php 中配置一致),HTTPS 站点请用 wss:// 并配置证书
- 调试时打开 log_file 配置项,查看连接建立、消息收发、异常关闭等完整链路日志
- 若提示 net::ERR_CONNECTION_REFUSED,优先检查防火墙、宝塔端口放行、Swoole 是否真启用(php --ri swoole 查看输出中是否有 WebSocket 支持)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











