thinkphp 5.1.41 本身不内置 websocket 支持,必须借助 workerman 等第三方常驻进程框架实现;因其官方生态对 swoole 支持较弱,而 workerman 是 tp5.1 最成熟稳定、文档最匹配的方案,推荐使用 think-worker 扩展完成安装、配置事件处理类、启动服务及 nginx 代理(wss)等完整流程。

安装 think-worker 扩展
在项目根目录执行命令(注意版本匹配):
- TP5.1.x 推荐安装 v2.0.* 版本(兼容性好):
composer require topthink/think-worker=2.0.* - 安装成功后,会自动发布配置文件到
config/worker.php和config/worker_server.php
配置 WebSocket 服务参数
编辑 config/worker_server.php,确保关键项如下:
-
'protocol' => 'websocket'—— 明确启用 WebSocket 协议 -
'host' => '0.0.0.0'—— 允许外部连接(生产环境慎用,可改为内网IP) -
'port' => 2346—— 自定义端口(如 2346),需确认服务器防火墙/安全组已放行 -
'eventHandler' => 'app\index\logic\Events'—— 指向你自定义的事件处理类(路径需存在且命名空间正确)
⚠️ 注意:eventHandler 类必须存在,且至少实现 onConnect、onMessage、onClose 方法(可为空实现,但不能缺失)。
编写事件处理逻辑
在 app/index/logic/Events.php 中创建类(按命名空间路径):
<?php namespace appindexlogic;
use WorkermanConnectionConnectionInterface;
class Events
{
public function onConnect(ConnectionInterface $connection)
{
echo "新连接: {$connection->id}
";
}
public function onMessage(ConnectionInterface $connection, $data)
{
$connection->send("收到: {$data}");
}
public function onClose(ConnectionInterface $connection)
{
echo "连接 {$connection->id} 已关闭
";
}
}
启动与验证服务
- 终端进入项目根目录,执行:
php think worker:server - 看到类似
Worker start success...并持续运行,说明服务已就绪 - 前端测试连接(替换为你的域名/IP和端口):
const ws = new WebSocket("ws://your-domain.com:2346");
控制台出现open事件即表示握手成功
? 若需 HTTPS 域名访问(wss://),必须通过 Nginx 反向代理,并配置 Upgrade 和 Connection 头(参考标准 WebSocket 代理规则)。
常见问题快速排查
-
启动报错 Class not found:检查
eventHandler类路径是否拼写错误、文件是否存在、命名空间是否匹配 -
前端连不上(ERR_CONNECTION_REFUSED):确认端口未被占用、防火墙放行、服务确实在运行(
ps aux | grep php) -
连接后立即断开:检查
onConnect中是否有未捕获异常或主动$connection->close() - 无法跨域连接:Workerman 默认允许所有来源,无需额外设置 CORS(WebSocket 协议本身不校验 Origin)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











