要在Yii3.0中启用真正可用的数据库连接池,必须绕过框架默认单连接模式,集成支持复用的底层驱动(如Swoole协程MySQL或Hyperf数据库连接池),并正确配置PDO持久连接与容器注入;需确认PDO扩展已启用且版本≥8.0,关闭PDO预处理模拟,且运行环境须为Swoole或RoadRunner等协程/常驻进程模型。

要在Yii3.0中启用真正可用的数据库连接池,必须绕过框架默认的单连接模式,直接集成支持连接复用的底层驱动,并配合容器注入与生命周期管理。Yii3本身不内置连接池实现,但可通过适配器层对接成熟的PHP连接池方案。
确认PDO扩展与连接池兼容性
检查当前PHP环境是否启用PDO及对应数据库驱动:php -m | grep pdo。若输出含pdo_mysql或pdo_pgsql,说明基础驱动就绪;若缺失,需先安装对应扩展并重启PHP服务。
Yii3要求PDO驱动版本不低于8.0+,低版本无法支持PDO::ATTR_PERSISTENT持久连接——这是连接池复用的前提。旧版PDO即使开启持久化,也会在请求结束时强制释放连接,起不到池化效果。
配置PDO持久连接(基础复用)
在config/common.php或config/db.php中定义数据库组件时,显式启用持久连接:
'db' => [ 'class' => \Yiisoft\Db\Connection::class, 'dsn' => 'mysql:host=localhost;dbname=myapp', 'username' => 'root', 'password' => '123456', 'options' => [ \PDO::ATTR_PERSISTENT => true, \PDO::ATTR_EMULATE_PREPARES => false, ], ]
【必须关闭PDO预处理模拟】否则MySQL原生预处理失效,导致连接无法被安全复用,甚至引发字符集错乱或SQL注入风险。
接入Swoole协程MySQL连接池(高可用方案)
方法一:使用swoole/mysql协程客户端 + 连接池封装
安装依赖:composer require swoole/library,确保PHP已启用Swoole扩展(v5.0+)。
创建连接池工厂类src/Pool/MySqlConnectionPool.php,继承Swoole\Coroutine\Pool,重写create()方法返回Swoole\Coroutine\Mysql实例,并设置connect_timeout、timeout等关键参数。
在DI容器中注册该池为单例:$container->set(MySqlConnectionPool::class, fn() => new MySqlConnectionPool(20));,其中20为最大空闲连接数。
方法二:通过hyperf/database适配层桥接(推荐用于混合部署)
该包已实现基于co\Channel的连接池调度,且兼容Yii3的QueryInterface。执行composer require hyperf/database后,在config/db.php中替换连接类为Hyperf\Database\Connection,并传入'pool' => ['min_connections' => 5, 'max_connections' => 50]配置项。
注意:此方式需禁用Yii3默认的Connection自动注入,改由Hyperf\Database\ConnectionFactory接管实例创建流程。
验证连接复用是否生效
第一步:在控制器中执行两次相同查询,中间插入usleep(10000)延时;
第二步:登录MySQL执行SHOW PROCESSLIST;,观察两次查询是否复用同一ID连接;
第三步:修改options中PDO::ATTR_PERSISTENT为false再测,此时应看到两个不同ID的新连接——证明此前确为复用。
若始终出现新连接ID,说明Web服务器(如Apache)未启用MPM事件模型,或PHP运行在CGI/FPM模式下——这两种模式下PDO持久连接实际无效,必须切换至Swoole协程或RoadRunner SAPI环境才能启用真实连接池。


















