优先选 think-swoole;高并发、长连接、实时推送场景用 swoole,低负载或 windows 环境选 workerman;两者互不兼容,tp5.1 需手动引入,且启动后绕过框架生命周期。

tp5.1 里装 think-swoole 还是 think-worker?先看需求再选
直接结论:高并发、长连接、实时推送(如聊天室、IM)优先用 swoole;低负载、快速验证、Windows 环境或不想装扩展,选 workerman。两者在 tp5.1 中互不兼容,不能混用。
think-swoole 是官方维护的 Swoole 集成包,依赖 PHP 扩展;think-worker 是对 Workerman 的轻量封装,纯 PHP 实现。tp5.1 默认不带任一扩展,必须手动引入。
常见误判点:composer require topthink/think-worker 装的是旧版(已停止维护),tp5.1 应用应改用 composer require topthink/think-swoole 或直接集成原生 Workerman —— 后者更可控,尤其涉及广播、连接管理等逻辑时。
装 Swoole 扩展失败的三个高频原因
不是 composer 报错,而是 php -m 看不到 swoole,或 php --ri swoole 提示版本低于 4.8 —— 这会导致 think-swoole 启动报错或握手失败。
- PHP 版本不匹配:Swoole v5.x 要求 PHP ≥ 7.4;tp5.1 推荐搭配 PHP 7.4–8.1,别用 PHP 8.2+(部分函数签名变更未适配)
- 扩展未启用:检查
php.ini是否有extension=swoole,且该 ini 文件确被加载(php --ini查路径) - 安全组/防火墙拦端口:启动后访问
http://127.0.0.1:9501失败,先确认netstat -tuln | grep 9501是否监听0.0.0.0:9501,而非仅127.0.0.1:9501
Windows 用户注意:Swoole 官方不支持 Windows,tp5.1 + Swoole 方案在 Windows 下只能跑在 WSL2 或 Docker 里,别浪费时间调 php_swoole.dll。
tp5.1 集成 Workerman 的正确姿势(绕过 think-worker 封装)
think-worker 在 tp5.1 中对 $worker 对象作用域控制太死,onMessage 回调拿不到 $worker->connections,导致无法广播——这不是配置问题,是设计限制。必须跳过封装,直连 Workerman 原生 API。
操作步骤:
- 执行
composer require workerman/workerman(别装topthink/think-worker) - 新建
server.php在项目根目录,内容为标准 Workerman 启动脚本,use Workerman\Worker开头 - 在
onMessage中用global $worker或闭包use ($worker)显式传入(注意:必须在Worker::runAll()前定义好回调) - 连接管理需自己维护:Workerman 不自动存用户 ID,要在
onConnect中给$connection->uid = uniqid(),广播时遍历$worker->connections并校验isset($worker->connection_info($fd))
示例关键片段:
$worker = new Worker('websocket://0.0.0.0:2346');
$worker->onMessage = function ($connection, $data) use ($worker) {
foreach ($worker->connections as $conn) {
if ($conn !== $connection && $conn->isConnected()) {
$conn->send($data);
}
}
};
启动命令和线上部署的硬性约束
tp5.1 本身无内置守护进程能力,所有常驻服务都靠外部进程管理。别信 php think swoole start -d 能稳定跑生产环境 —— 它只是简单 fork,没健康检查、无自动拉起、日志不分离。
线上必须用:
- systemd(Linux):写
.service文件,设Restart=always,日志重定向到/var/log/your-app/ - supervisord:更轻量,适合 Docker 场景,配置里加
autostart=true和startretries=3 - 别用
nohup php server.php &:子进程崩溃后不会重启,查问题时连日志都没地方找
最后提醒一个易忽略点:Swoole/Workerman 启动后,所有请求都绕过 tp5.1 的 HTTP 生命周期(App::run() 不执行),中间件、路由、数据库连接池等全失效。业务逻辑该拆的还得拆 —— ThinkPHP 只负责页面渲染和登录鉴权,长连接通信必须由独立服务承载。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











