Laravel+Soketi WebSocket连接意外断开(4201错误)求助
解决Soketi连接2分钟断开及重连订阅恢复问题
一、调整Soketi配置,延长连接时长
修改Soketi配置文件,添加心跳与超时参数,避免服务器主动断开连接:
{ "debug": true, "port": 6001, "socketOptions.pingInterval": 30000, // 每30秒发送一次心跳包 "socketOptions.pingTimeout": 60000, // 60秒未收到心跳则判定连接断开 "connectionTimeout": 86400000, // 设置连接超时为24小时(毫秒) "appManager.array.apps": [ { "id": "SLMT", "key": "1229272", "secret": "sLq2dAswE&9q", "webhooks": [ { "url": "", "event_types": ["channel_occupied"] } ] } ] }
修改后重启Soketi服务。
二、同步Laravel广播配置,匹配心跳设置
在config/broadcasting.php的Pusher配置中,添加客户端心跳与超时参数,确保客户端与Soketi的心跳机制同步:
'pusher' => [ 'driver' => 'pusher', 'key' => env('PUSHER_APP_KEY'), 'secret' => env('PUSHER_APP_SECRET'), 'app_id' => env('PUSHER_APP_ID'), 'options' => [ 'host' => env('PUSHER_HOST'), 'port' => env('PUSHER_PORT'), 'scheme' => env('PUSHER_SCHEME', 'http'), 'cluster' => env('PUSHER_APP_CLUSTER'), 'useTLS' => env('PUSHER_SCHEME') === 'https', 'heartbeat_interval' => 30, // 与Soketi的pingInterval对应,单位秒 'timeout' => 60, // 请求超时时间,单位秒 'keepAlive' => true // 保持长连接 ], ],
执行配置缓存刷新:
php artisan config:cache
三、解决重连后订阅频道的问题
由于API使用Sanctum鉴权,私有/ Presence频道的订阅依赖有效鉴权凭证,Postman自动重连不会自动执行鉴权与订阅流程,需手动处理:
- 重连成功后,重新向Laravel的广播鉴权端点(默认
/broadcasting/auth)发送请求,携带Authorization: Bearer {token}请求头,获取频道授权。 - 使用授权结果重新订阅目标频道。
若为实际客户端代码,需封装重连逻辑:
- 监听WebSocket的
disconnected事件,触发重连。 - 重连成功后,重新获取用户的Sanctum token,发起鉴权请求,再重新订阅所有之前的频道。
四、排查环境层面的连接限制
Windows环境下检查以下设置:
- 防火墙是否拦截Soketi 6001端口的长时间连接,可临时关闭防火墙测试。
- 查看系统TCP连接超时设置:执行
netsh int tcp show global,若网络设备提前断开连接,可调整KeepAliveInterval等参数。
五、查看Soketi日志定位问题
已开启Soketi的debug: true,启动服务时会输出详细日志,连接断开时查看日志中的具体错误信息(如心跳超时、鉴权失败等),进一步精准排查。
内容的提问来源于stack exchange,提问作者Edgar
相关产品推荐
相关产品推荐

