thinkphp 8.0本身不是微服务框架,但可通过集成gatewayworker构建具备微服务特征的通信底座——核心是解耦连接层与业务层,让web请求、设备接入、消息推送各司其职,互不干扰。

明确角色分工:GatewayWorker不写业务逻辑
这是最关键的实践前提。GatewayWorker只做三件事:维持长连接、转发数据、广播/单推消息。所有用户状态管理、数据库操作、权限校验必须放在ThinkPHP的MVC层完成。
- Gateway进程(start_gateway.php):监听WebSocket/TCP端口,不做任何DB或Model调用
- BusinessWorker进程(Events.php或自定义Handler):仅解析协议、提取参数,然后立即调用GatewayClient通知TP业务系统
- ThinkPHP控制器:接收GatewayClient发来的请求(如HTTP POST /api/push/handle),执行真实业务,再通过GatewayClient反向推送结果
多协议共存配置要点
TP8 + think-worker 支持TCP/WebSocket/MQTT同服运行,但需按协议类型分进程启动,避免端口冲突和协议混用。
- WebSocket服务:用
php think worker:server,默认端口2345,前端用ws://yourdomain:2345 - TCP网关服务:用
php think worker:gateway,需在config/gateway_worker.php中将gateway协议设为tcp://0.0.0.0:7272,供硬件设备直连 - MQTT客户端:在BusinessWorker的
onWorkerStart中实例化Workerman\Mqtt\Client,订阅主题并绑定回调,不暴露MQTT端口给外部
消息推送闭环设计
真正稳定的推送不是“前端连上就发”,而是“业务触发→TP处理→确认结果→定向下发”。推荐采用双通道模式:
- 上行通道(前端→TP):Vue/小程序调用TP接口(如
POST /api/device/control),TP校验后写库,再用GatewayClient::sendToUid()通知对应设备连接ID - 下行通道(TP→前端):BusinessWorker收到设备上报后,不直接响应,而是发HTTP请求到TP的
/api/webhook/receive,由TP统一做消息组装与权限过滤,再调用GatewayClient::sendToGroup()推送给在线Web端
生产环境必须做的几件事
本地能跑不等于线上可用,以下配置直接影响稳定性与可观测性:
- 用Supervisor守护进程,禁止直接前台运行;每个Worker类型(server/gateway)单独配一个program段
- Nginx需配置WebSocket升级头:
proxy_set_header Upgrade $http_upgrade;和proxy_set_header Connection "Upgrade"; - 关闭GatewayWorker的自动心跳(
'ping_interval' => 0),改由前端每30秒发空消息保活,避免网关误判离线 - 所有GatewayClient调用必须加try-catch,并记录
Gateway::isOnline($uid)返回值,失败时降级为站内信或轮询
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











