thinkphp本身不支持长连接,必须借助swoole或workerman实现即时通讯;核心是swoole启动websocket服务接管连接,thinkphp处理业务逻辑,通过think-swoole协同工作,配置正确后两小时内可跑通聊天室。

ThinkPHP本身不支持长连接,要实现即时通讯,必须借助Swoole或Workerman这类能常驻内存、处理并发连接的扩展或框架。核心思路是:用Swoole启动WebSocket服务接管连接,ThinkPHP负责业务逻辑(比如用户认证、消息存库),两者通过think-swoole官方包协同工作。配置对了,写法顺了,一个可用的聊天室两小时内就能跑起来。
环境与依赖一步到位
别跳过这步——90%的连接失败都卡在这里。
- PHP版本至少7.4,推荐8.1+;运行
php -r "echo extension_loaded('swoole') ? '✓' : '✗';"确认Swoole已启用 - 执行
pecl install swoole安装扩展,然后在php.ini里加extension=swoole并重启PHP服务 - 项目中装
topthink/think-swoole:^4.1,注意删掉旧版再装,避免版本冲突 - 端口如9502需在服务器防火墙和宝塔面板中放行,前端才能连上
swoole.php配置不能只开开关
这个文件不是开关列表,而是服务骨架。缺字段或路径错,服务根本起不来。
-
'websocket' => ['enabled' => true]必须显式开启,不能只写'websocket' => true -
'handler'要指向你写的事件处理器类,例如\app\listener\WsHandler::class -
'route_file'路径必须真实存在,比如app_path() . 'websocket.php',且该文件要定义消息类型映射 - 开发时把
'daemonize' => false,方便看控制台日志排查问题
事件处理类要抓住三个关键点
连接、收消息、断开——这三个方法写错一个,客户端就“黑屏”或反复重连。
-
onOpen里建议记录$request->fd并做简单身份校验(比如检查token参数),避免匿名乱入 -
onMessage收到数据后,先json_decode($frame->data, true)解析,再决定广播还是单发;用$this->broadcast()推给所有人,用$this->send($fd, $data)定向推送 -
onClose可清理内存中的用户状态,比如从在线列表里移除该$fd
前端连接和调试有门道
浏览器连不上?八成是URL或心跳没配对。
- 前端用
new WebSocket('ws://your-domain.com:9502'),HTTPS站点必须用wss://并配SSL证书 - 服务端设了
ping_interval(比如25秒),前端就要每20秒主动发ping保活,否则连接会被自动断开 - 打开浏览器开发者工具的Network标签页,筛选WS,看Connection Established是否出现;没出现就回头查端口、域名、CORS(Swoole默认不走HTTP中间件,CORS通常不用额外配)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











