必须升级swoole≥4.8.0、php≥8.0,卸载旧版think-swoole,安装v3.1.0+并配置database节点启用连接池,数据库驱动改为mysqlnd,业务代码全部改用db::pool()调用。

当你的ThinkPHP8应用在秒杀或大促期间频繁报错“Too many connections”,日志里堆满PDO异常,而MySQL的show processlist显示连接数早已突破max_connections限制——这不是数据库扛不住,而是你还在用FPM模式跑协程代码,连接池根本没生效。
确认Swoole环境与扩展版本
执行php --ri swoole,检查输出中Version字段是否为≥4.8.0;若版本低于4.8.0,或未显示swoole扩展,必须先升级或安装。Swoole 4.7.x及以下版本不支持完整的协程MySQL客户端,强行启用连接池会导致字段错乱或“MySQL server has gone away”错误。
运行php -v确认PHP版本≥8.0;低于该版本无法加载think-swoole 3.1.0+扩展。
【必须卸载旧版think-swoole】:若之前安装过topthink/think-swoole:^2.x,先执行composer remove topthink/think-swoole,再安装新版——旧版不兼容TP8的容器结构,会静默跳过连接池初始化。
安装并发布Swoole配置文件
在项目根目录执行:composer require topthink/think-swoole:^3.1.0。
执行php think swoole:publish生成config/swoole.php;该命令仅生成一次,重复执行不会覆盖已有配置。
若提示“Command 'swoole:publish' is not defined”,说明think-swoole未正确注册,需检查composer autoload是否生效,或手动清空runtime/cache/下的容器缓存。
配置数据库连接池参数
打开config/swoole.php,定位到'database'节点(不是database.php!),修改为:
'database' => [
'enable' => true,
'min_connections' => 5,
'max_connections' => 50,
'wait_timeout' => 3.0,
'heartbeat' => 30,
],
【max_connections必须≤MySQL的max_connections值】:登录MySQL执行SHOW VARIABLES LIKE 'max_connections';,若返回值为30,则此处最大只能设28,否则多余连接会被MySQL直接拒绝,引发Connection refused。
min_connections设为5表示服务启动时预热创建5条空闲连接,避免首请求因建连延迟超时;设为0会导致每次首请求都卡住等待建连。
强制切换MySQL驱动为mysqlnd+swoole_mysql
打开config/database.php,找到'default'配置项,将'type'从'pdo_mysql'改为'mysqlnd'。
在同文件中,确保'hostname'、'username'、'password'、'database'等字段与config/swoole.php中的database节点完全一致——连接池只复用“完全相同”的连接参数,host带端口与不带端口视为两个不同池。
这一步不可跳过:pdo_mysql在协程环境下非线程安全,多个协程共用同一PDO实例时,查询结果可能出现字段错位或数据污染;只有mysqlnd配合think-swoole的适配层才能保证连接真正可复用且安全。
重写业务代码启用连接池
第一步:删除所有直接调用Db::table()、Db::connect()或模型类默认查询的地方。
第二步:将原写法Db::table('user')->where('id', 1)->find(),全部替换为:Db::pool()->table('user')->where('id', 1)->find()。
第三步:事务必须改写——原Db::transaction(function () { ... })仍走短连接;正确写法是:Db::pool()->transaction(function () { ... })。
第四步:模型类如UserModel需重写db()方法,返回池化实例:return Db::pool();,否则模型查询依旧绕过连接池。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











