必须启用Swoole协程长连接池隔离AI流量:先确认php think swoole启动且Swoole≥4.8.0、think-swoole≥3.1.0;再配置ai_db数据源(hostname用127.0.0.1、PDO持久化通过params传入);接着在swoole.php中启用ai_pool并显式调用Db::pool('ai_pool')->connect('ai_db');最后禁用主库pool配置,确保物理隔离。

AI服务高频调用TP接口做向量检索、特征查库、策略回写时,数据库连接数飙升、报“Too many connections”或大量Sleep连接堆积,本质是短连接在高QPS下耗尽MySQL资源,必须启用长连接并隔离AI专用连接池。
确认运行模式与扩展依赖
先执行php think run和php think swoole对比输出,只有php think swoole启动的协程服务才支持连接池;FPM模式下所有pool配置均无效。若输出含“Swoole HTTP Server”字样,继续下一步;否则停止配置,改用php think swoole启动。
检查Swoole版本:php --ri swoole,确认≥4.8.0;再执行composer show topthink/think-swoole,确保≥3.1.0。低于任一版本,执行composer update topthink/think-swoole升级。
配置AI专用长连接数据源
打开config/database.php,在'connections'数组内新增一个名为'ai_db'的数据源:
立即学习“PHP免费学习笔记(深入)”;
复制以下配置,【hostname必须填127.0.0.1,不能写localhost】,否则Windows下会走命名管道导致SQLSTATE[HY000] [2054]错误;【password为空时,MySQL 8.0+必须已将root认证插件改为mysql_native_password】,否则Access denied无法绕过。
'ai_db' => [<br> 'type' => 'mysql',<br> 'hostname' => '127.0.0.1',<br> 'hostport' => 3306,<br> 'database' => 'ai_features',<br> 'username' => 'ai_user',<br> 'password' => 'your_strong_pass',<br> 'charset' => 'utf8mb4',<br> 'prefix' => '',<br> 'debug' => false,<br> 'deploy' => 0,<br> 'break_reconnect' => true,<br> 'check_conn' => true,<br> 'params' => [<br> PDO::ATTR_PERSISTENT => true<br> ]<br>],
注意:PDO的持久化必须通过params传入PDO::ATTR_PERSISTENT => true,写'persistent' => true会被忽略。
启用连接池并隔离AI流量
打开config/swoole.php,在'db_pool'节点下添加AI专属池配置:
① 定义池参数:'ai_pool' => [ 'max_idle' => 4, 'max_active' => 16, 'wait_timeout' => 2000, 'idle_timeout' => 60 ]
② 在'db_pool'顶层键下,将'enable'设为true,否则整个池功能不生效。
③ 关键操作:代码中必须显式调用Db::pool('ai_pool'),而非Db::connect('ai_db')——后者仍走短连接,Db::pool('ai_pool')->connect('ai_db')才真正启用池化长连接。
④ AI接口内统一使用:$result = Db::pool('ai_pool')->connect('ai_db')->table('vector_index')->where('id', $id)->find();
这一步不可省略:模型类如VectorModel默认不走池子,若要用模型,需重写db()方法返回Db::pool('ai_pool')->connect('ai_db')实例。
禁用主库连接池干扰
删除config/database.php中所有'pool'相关字段(如'pool' => ['enable' => true]),TP8在FPM或非Swoole协程下完全无视该配置,残留反而引发误判。
主库(如'mysql')保持短连接配置,确保业务查询与AI流量物理隔离——AI查向量库、落特征表,绝不复用主库连接池,避免因AI高并发拖垮核心交易链路。
验证方式:在AI控制器里执行Db::pool('ai_pool')->getPdo(),同一协程内多次调用返回相同PDO对象ID,说明连接复用成功。



















