yii原生不提供连接池,需通过pdo持久连接或第三方扩展(如swoole、yurunsoft/php-swoole-pool)实现;验证需观察mysql线程数稳定及日志中连接复用记录。

在高并发场景下,Yii应用频繁创建销毁数据库连接会导致响应延迟飙升、MySQL报“Too many connections”错误,必须通过连接池机制复用连接资源。
确认当前是否启用连接池
打开 config/db.php 或 config/main.php 中的 db 组件配置,检查是否存在 【'class' => 'yii\db\Connection'】 且未被自定义替换为第三方连接池类(如 Swoole MySQL 连接池)。
运行 php yii debug/info 查看数据库组件实际加载类名——若输出为 yii\db\Connection,说明当前使用的是 Yii 原生连接管理,它本身不提供连接池功能,仅做连接缓存与复用,需额外配置或扩展。
启用 PDO 连接复用(基础层优化)
Yii 原生依赖 PDO,而 PDO 自带连接复用能力,但默认关闭。在 DSN 后追加 ;charset=utf8mb4 并启用持久连接:
'dsn' => 'mysql:host=localhost;dbname=myapp;charset=utf8mb4;unix_socket=/var/run/mysqld/mysqld.sock'
在连接配置中显式开启 PDO::ATTR_PERSISTENT:
'attributes' => [PDO::ATTR_PERSISTENT => true],
⚠️ 注意:持久连接在 PHP-FPM 模式下有效,但在 CLI 或短生命周期脚本中可能引发连接泄漏,切勿在命令行任务中启用。
接入第三方连接池(生产级方案)
Yii 原生不内置连接池,必须引入外部实现。推荐两种主流路径:
方法一:Swoole 协程 MySQL 连接池(适用于 Swoole HTTP 服务器)
安装扩展:pecl install swoole → 在 config/web.php 中注册自定义 DB 组件:
'db' => ['class' => 'app\components\SwooleDb'],
在 app/components/SwooleDb.php 中继承 yii\db\Connection,重写 open() 方法,改用 Swoole\Coroutine\Mysql->connect() 获取协程连接,并通过 Pool 类管理连接队列。
方法二:使用 yurunsoft/php-swoole-pool 扩展(兼容 FPM + Swoole)
执行:composer require yurunsoft/php-swoole-pool
在 config/db.php 中替换连接类:
'class' => 'Yurun\Util\Pools\MysqlPool',
配置连接池参数:
'config' => ['host' => 'localhost','port' => 3306,'username' => 'root','password' => '123456','database' => 'myapp','charset' => 'utf8mb4','minActive' => 5,'maxActive' => 50,'timeout' => 3.0,],
该扩展会自动接管所有 Yii::$app->db 调用,无需修改业务代码。
验证连接池生效
第一步:在 MySQL 中执行 SHOW STATUS LIKE 'Threads_connected'; 记录初始连接数。
第二步:用 ab 或 wrk 对一个简单查询接口压测 100 并发 × 100 次:ab -n 10000 -c 100 http://localhost/api/users
第三步:再次执行 SHOW STATUS LIKE 'Threads_connected'; —— 若数值稳定在 【maxActive 配置值附近,而非随并发线性增长】,说明连接复用成功。
第四步:查看 Yii 日志 runtime/logs/app.log,搜索 connection acquired 和 connection released 行,确认连接获取/归还频次远低于请求总数。











