thinkphp7本身不内置websocket服务端,必须依赖swoole或workerman等常驻进程;前端通过new websocket()连接已启动的服务,php业务逻辑通过http/redis通知该服务执行$connection->send()实现推送。

ThinkPHP7 本身不提供 WebSocket 服务端能力
直接在 ThinkPHP7 的前端页面里“调用 WebSocket 推送”这个说法容易误解——WebSocket 是双向通信协议,前端只能 new WebSocket() 去连接一个已运行的 WebSocket 服务端,而 ThinkPHP7(截至当前稳定版)默认不内置 WebSocket 服务,也不处理长连接、心跳、广播等逻辑。
所以真正要解决的问题是:如何让前端页面通过 WebSocket 实时接收数据,而数据源来自 ThinkPHP7 后端业务逻辑(比如订单更新、消息提醒)。
常见错误现象:WebSocket connection to 'ws://localhost:8080/' failed,本质是前端连了个根本没启动的服务地址。
- ThinkPHP7 负责生成推送内容、触发通知(例如用户下单后调用推送接口)
- WebSocket 服务必须由独立进程承载,如
Swoole、Workerman或 Node.js 服务 - 前端页面只负责连接该服务,并监听
onmessage
推荐搭配 Workerman 实现轻量级 WebSocket 服务
相比 Swoole(需编译扩展),Workerman 纯 PHP 实现、无需扩展、易于调试,与 ThinkPHP7 共存友好。它能监听端口(如 ws://127.0.0.1:2346),并提供 API 让 ThinkPHP7 主动推送消息。
实操建议:
- 用
composer require workerman/workerman安装到项目根目录或独立目录均可 - 写一个
websocket_server.php,基于Worker和WebServer启动 ws 服务,监听0.0.0.0:2346 - 在 ThinkPHP7 控制器中,用
file_get_contents()或cURL调用 Workerman 提供的 HTTP 推送接口(如http://127.0.0.1:2345/send?uid=123&msg=hello),由 Workerman 转发给指定连接 - 确保 Workerman 进程常驻:
php websocket_server.php start -d,且防火墙放行对应端口
前端页面连接 WebSocket 并监听推送
ThinkPHP7 前端模板(如 index.html 或 index.php 视图)里只需标准 JavaScript 连接逻辑,和 ThinkPHP7 框架无关。
示例片段:
const ws = new WebSocket('ws://127.0.0.1:2346');
ws.onopen = () => console.log('已连接 WebSocket 服务');
ws.onmessage = (e) => {
const data = JSON.parse(e.data);
console.log('收到推送:', data);
// 如需更新 DOM,这里操作即可
};
ws.onerror = (err) => console.error('WebSocket 错误:', err);
注意点:
- 域名和协议必须匹配:本地开发用
ws://,上线务必换成wss://并配好 SSL - 不要在
onmessage里直接执行耗时操作(如大量 DOM 渲染),避免阻塞连接 - 如果页面需要识别用户身份,建议连接时带上参数:
new WebSocket('ws://...?token=xxx'),并在 Workerman 服务端校验
ThinkPHP7 如何触发一次精准推送
关键不在“前端怎么调用”,而在“后端业务发生时,如何把消息扔进 WebSocket 管道”。Workerman 官方推荐用 TextProtocol + 自定义 HTTP 接口做桥接。
典型流程:
- 用户支付成功 → ThinkPHP7 执行
OrderService::handlePaid($order) - 该方法内发起一次 HTTP 请求:
file_get_contents("http://127.0.0.1:2345/send?uid={$order->user_id}&msg=订单{$order->no}已支付") - Workerman 的 HTTP 路由收到请求,查出该
uid对应的 WebSocket 连接(需提前在onConnect阶段绑定uid到$connection->uid),再调用$connection->send(...)
性能影响:HTTP 请求是短连接,开销小;真正广播由 Workerman 内存级完成,无数据库压力。但要注意 Workerman 进程间无法共享连接列表——单机部署没问题,集群需改用 Redis 订阅/发布同步状态。
容易被忽略的一点:WebSocket 连接是瞬态的,用户关闭页面或网络中断后连接即断,ThinkPHP7 的推送请求若此时发出,Workerman 会找不到目标连接。别指望“补推”,得靠前端重连机制 + 服务端记录未读数。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











