CodeIgniter4读写分离与连接池管理实战

大晨同学_5715

大晨同学_5715

2026-08-08

220人浏览

原创

ci4默认不支持读写分离,需重写db工厂逻辑实现:通过sql类型判断(正则匹配select等)动态切换主从连接,事务内强制走主库,避免预处理与混合语句误判,连接复用依赖sharedinstance且不可跨请求。

codeigniter4读写分离与连接池管理实战

CI4 默认不支持读写分离,必须自己扩展 DB 类

CodeIgniter 4 的 Database 类在初始化时只加载一个配置项($db = \Config\Database::connect()),底层不区分主从、也不识别 SQL 类型。所谓“透明读写分离”,本质是拦截查询执行前的 SQL 类型判断 + 动态切换连接实例。官方没提供钩子,所以必须重写 BaseConnection 或包装 DB 工厂逻辑。

常见错误是直接改 system/Database/DB.php —— 这会导致升级失败。正确做法是在 app/Database/DB.php(手动创建)中复写工厂方法,并让 \Config\Database::connect() 指向它。

  • 不要启用 autoConnect,否则每次请求都连主库浪费资源
  • 主库连接应标记为 write,从库连接标记为 read,用 sharedInstance 控制复用
  • SQL 判断不能只看关键词(如 SELECT),要跳过注释、字符串、大小写干扰,建议用正则 /^\s*(SELECT|SHOW|EXPLAIN|DESCRIBE)/i

如何动态选择主库或从库连接

核心逻辑在连接获取阶段:不是“执行时才选”,而是“首次调用 db() 时根据当前上下文决定返回哪个连接实例”。CI4 的 db() 辅助函数默认走 Database::connect(),你可以把它替换成自定义工厂:

// app/Database/DB.php
function db($group = null, $getShared = true)
{
    if ($group === 'read') {
        return \Config\Database::connect('slave', $getShared);
    }
    if ($group === 'write') {
        return \Config\Database::connect('master', $getShared);
    }
    // 默认行为:根据当前 SQL 类型决定
    $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2);
    $caller = $backtrace[1]['function'] ?? '';
    if (in_array($caller, ['query', 'simpleQuery', 'table'])) {
        $sql = $_SERVER['CI4_LAST_SQL'] ?? '';
        if (preg_match('/^\s*(SELECT|SHOW|EXPLAIN|DESCRIBE)/i', $sql)) {
            return \Config\Database::connect('slave', $getShared);
        }
    }
    return \Config\Database::connect('master', $getShared);
}

注意:$_SERVER['CI4_LAST_SQL'] 需配合 Query Builder 的 getCompiledSelect() 等方法提前捕获,不能依赖运行时未解析的原始字符串。

CodeIgniter 4.7.0
CodeIgniter 4.7.0

CodeIgniter下载页提供 CodeIgniter 4.7.0 官方源码包,并整理框架安装、数据库配置与入门开发说明。

下载
  • 避免在模型里硬编码 db('slave') —— 违反“对开发者透明”原则
  • 事务内所有操作必须强制走主库,哪怕语句是 SELECT,需监听 startTransaction() 状态
  • 连接复用靠 $getShared 参数控制,设为 false 会新建连接,慎用于长耗时任务

连接池管理只能靠应用层模拟,CI4 无原生支持

MySQL 本身没有连接池概念,PHP-FPM 模式下每个请求进程独立维护连接,所谓“连接池”其实是复用已建立的连接实例。CI4 的 BaseConnection 支持 sharedInstance,但默认只对同一配置组生效。要实现跨组复用(比如多个从库间轮询),得自己加一层路由逻辑:

  • 把从库配置成数组('slaves' => [['hostname' => '192.168.1.10'], ['hostname' => '192.168.1.11']]
  • spl_object_id() 或计数器做简单轮询,避免单点过载
  • 连接健康检查不能依赖 ping()(太重),建议在 connect() 失败时标记该节点临时不可用,5 秒后自动恢复
  • 不要试图复用连接跨请求生命周期 —— PHP-FPM 请求结束即销毁资源,强行保持只会泄漏内存

最容易被忽略的事务与预处理语句陷阱

读写分离下,SELECT ... FOR UPDATEINSERT ... SELECT 这类混合语句会被误判为纯读操作,发到从库导致报错。CI4 的 Query Builder 不会自动识别这类语义,必须人工干预:

  • 显式调用 db('write')->table(...) 强制走主库,适用于已知需写锁的场景
  • 预处理语句(prepare())的 SQL 在 prepare 阶段就需确定连接,但 CI4 的 PreparedQuery 是懒加载,实际执行才 connect —— 所以 prepare 时传入的 $db 实例必须是主库
  • 使用 DB::transStart() 后,后续所有 db() 调用应自动绑定到事务关联的主库连接,否则 commit 会失败

真正麻烦的是那些封装在服务类里的数据库调用 —— 它们可能跨多层调用链,一旦某处漏了连接指定,故障就难以追踪。建议在关键服务构造时注入明确的 $dbWrite$dbRead 实例,而不是依赖全局 db() 函数。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
PHP CodeIgniter框架
PHP CodeIgniter框架

本专题专注于 PHP 轻量级框架 CodeIgniter 的学习与应用,系统讲解 MVC 模型、路由与控制器、数据库操作、表单验证、安全机制以及 REST API 开发。通过博客系统、内容管理平台和小型电商等实战项目,帮助学员快速掌握 CodeIgniter 的开发方法与实践技能。

2025.08.28

3239

16

NumPy数组创建索引切片与数据选择
NumPy数组创建索引切片与数据选择

本专题整理 NumPy 数组创建、索引、切片与数据选择相关教程,覆盖 np.array、zeros/ones、多维数组形状、基础切片、花式索引、布尔索引、条件筛选、视图与副本等常用场景,帮助读者系统掌握 ndarray 数据构造与高效提取方法。

2026.09.21

0

12

Aionclaw智能助手介绍
Aionclaw智能助手介绍

本专题汇总了AionClaw(AI龙虾助手)的功能介绍与在线使用入口。AionClaw是杭州趣猿人工智能有限公司推出的桌面级AI智能体,能直接在电脑上读写文件、运行脚本、操作浏览器,自动交付Word、PPT、Excel等成品。

2026.09.20

20

13

AionClaw AI智能体与电脑自动化任务执行功能使用教程
AionClaw AI智能体与电脑自动化任务执行功能使用教程

AionClaw专题整理AI智能体与电脑自动化相关功能使用教程,涵盖安装部署、AI任务执行、Skills技能、文件处理、浏览器控制、电脑操作、持久记忆、聊天工具连接以及办公、编程和内容创作等功能,帮助用户快速掌握AionClaw的实际使用方法。

2026.09.20

0

15

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

2026.09.16

180

9

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

2026.09.16

100

10

Pandas时间序列分析与可视化报表
Pandas时间序列分析与可视化报表

本专题整理Pandas日期转换、时间索引、重采样、滚动窗口、时区处理、plot绘图、Styler表格样式和报表输出方法。

2026.09.16

80

23

Pandas数据筛选索引与清洗处理
Pandas数据筛选索引与清洗处理

本专题整理Pandas中的loc、iloc、条件筛选、query查询、缺失值处理、重复值删除、类型转换和字符串列清洗方法。

2026.09.16

60

25

Pandas数据读取导入与文件导出处理
Pandas数据读取导入与文件导出处理

本专题整理Pandas读取CSV、Excel、JSON、SQL、Parquet等文件的方法,以及to_csv、to_excel、to_sql和to_parquet等常用数据导出流程。

2026.09.16

40

27

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程