讲师中心 微信公众号
AI工具推荐 视频效率加速

Yii2的数据库连接池怎么实现_使用pmmp/yii2-connection-pool【操作】

夏杰同学_7985

夏杰同学_7985

发布时间:2026-03-26 10:28:31

|

188人浏览过

|

来源于php中文网

原创

pmmp/yii2-connection-pool 是专为 Swoole 协程设计的 PDO 连接池扩展,需在协程上下文手动初始化、单例注入 DI 容器,并严格通过 get()/put() 管理连接;不适用于 PHP-FPM/Apache,且无内置健康检查。

yii2的数据库连接池怎么实现_使用pmmp/yii2-connection-pool【操作】

Yii2 本身没有内置连接池,pmmp/yii2-connection-pool 是第三方扩展

Yii2 的 yii\db\Connection 默认每次请求新建/复用 PDO 连接,但底层不维护连接池——它依赖 PHP-FPM 进程生命周期或 Swoole 协程环境下的连接复用机制,不是传统意义上的“连接池”。pmmp/yii2-connection-pool 是为 Swoole(尤其是协程模式)设计的轻量封装,本质是用 Swoole\Coroutine\Channel 管理预创建的 PDO 实例。

常见错误现象:Fatal error: Uncaught Swoole\Error: Unable to create channel 或连接数远超预期,多因未在协程上下文初始化、或在非 Swoole 环境(如普通 PHP-FPM)中强行启用。

  • 只适用于 Swoole >= 4.5 + 协程模式(enable_coroutine => true),PHP-FPM / Apache 下直接报错或静默失效
  • 必须在协程启动后、首次数据库操作前完成连接池初始化,不能放在 config/web.php 顶层执行
  • maxIdle 和 maxActive 不是 MySQL 的 max_connections,而是池内对象数量,设太高会撑爆内存,太低则频繁创建销毁抵消性能收益

pmmp/yii2-connection-pool 的正确初始化时机和位置

它不能像原生 db 组件那样在配置文件里声明即生效。必须手动在协程入口(如 Swoole HTTP Server 的 onRequest 回调、或 Yii2 的 Bootstrap 类中检测协程环境后调用)。

典型错误:在 common/config/main.php 中直接 new Pool() —— 此时无协程上下文,Channel 创建失败;或在控制器 action 里每次 new 一个池,导致连接泄漏。

Yii Framework 2.0.51
Yii Framework 2.0.51

Yii Framework 2.0.51 官方 Basic 应用模板,适合旧项目兼容、升级验证和开发测试。

下载
  • 推荐在自定义 Bootstrap 类的 bootstrap() 方法中,用 if (Swoole\Coroutine::getCid() > 0) 判断是否已进入协程
  • 池实例应单例化并注入到 DI 容器,避免重复初始化;例如绑定为 'dbPool',后续通过 Yii::$app->get('dbPool') 获取
  • 初始化时传入的 config 数组需包含完整 PDO DSN 信息,且 username/password 必须显式传入,不能复用原 db 组件配置里的敏感字段(因组件可能已被初始化)

从连接池获取连接的实际写法和常见漏点

拿到池对象后,不能直接调用 open() 或 createConnection(),必须用 get() 并配合 try/finally 归还——这是最容易被忽略的一步,漏掉会导致连接永远卡在池中,池迅速耗尽。

示例片段:

$pool = Yii::$app->get('dbPool');
$conn = $pool->get(); // 阻塞直到有空闲连接
try {
    $stmt = $conn->prepare('SELECT * FROM user WHERE id = ?');
    $stmt->execute([$id]);
    return $stmt->fetchAll();
} finally {
    $pool->put($conn); // 必须放回!不可省略
}
  • $pool->get() 在池空时默认阻塞,可传 timeout 参数(单位秒)避免无限等待,例如 $pool->get(0.5)
  • 不要对返回的 $conn 调用 close() 或 __destruct(),它不是真实 PDO 连接,只是池管理的代理对象
  • 若在事务中使用,需确保整个事务块都在同一 $conn 上执行,且 put() 放在事务提交/回滚之后

性能与兼容性边界:什么时候不该用这个包

它解决的是高并发协程场景下 PDO 创建开销问题,但代价是内存占用和逻辑复杂度上升。很多项目其实根本不需要。

  • QPS PDO::ATTR_PERSISTENT => true)+ MySQL 连接复用已足够,加池反而增加调度负担
  • 使用 yii2-redis 或其他非 PDO 数据源时,该包完全不适用——它只包装 PDO,不涉及任何 Redis、MongoDB 等协议
  • 若项目混用 Swoole 协程和同步阻塞逻辑(比如部分命令行任务仍走传统 FPM 模式),必须严格隔离配置,否则 get() 在非协程环境会死锁

最常被忽略的点:这个包不处理连接健康检查。如果 MySQL 主动断开空闲连接(wait_timeout),池里的连接可能变成“僵尸”,需要自己加 PDO::ping() 或设置 validationQuery 做探活——但它本身没提供这个钩子。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2293

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

1399

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

835

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3192

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

5408

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

1199

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5671

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

4962

2023.08.14

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Yii Framework 2.0 API 官方文档
Yii Framework 2.0 API 官方文档

共0课时 | 0人学习

Yii2.0框架开发实战视频教程
Yii2.0框架开发实战视频教程

共22课时 | 9.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn