CodeIgniter 3 的 driver 机制是基于命名约定和 CI_Driver_Library 的类代理模式,并非真正可热插拔的插件系统;它硬编码扫描 drivers/ 目录、要求严格命名(如 redis.php → Redis 类)、依赖手动维护 $valid_drivers 数组,且不支持 Composer 或 PSR-4 动态加载。

CodeIgniter 3 的 driver 扩展机制本质是伪驱动,不是真插件系统
CI 3 的 driver 并非运行时动态加载或可热插拔的驱动架构,而是一套基于命名约定 + CI_Driver_Library 的类代理模式。它要求你把所有子驱动放在固定目录(libraries/Your_driver_name/drivers/),且必须继承 CI_Driver,父类库本身得继承 CI_Driver_Library。这意味着:它不支持 Composer 自动发现、不支持 PSR-4 动态映射、也不允许在运行时注册新驱动类型。
常见误判是以为加个新 .php 文件就能“启用驱动”——实际会报 Class 'CI_Driver_XXX' not found 或 Invalid driver: XXX,因为 CI 在初始化时就硬编码扫描了 drivers/ 子目录,并只认特定命名格式。
- 驱动类文件名必须全小写,如
redis.php,对应类名必须是Redis(首字母大写,无下划线) - 父库类名必须是
Your_driver_name,且文件放在libraries/Your_driver_name.php - 子驱动类必须声明
public $valid_drivers = ['redis', 'file', 'memcached'];,拼写必须和文件名完全一致 - CI 不会自动
require_once驱动文件,而是用class_exists()检查后反射调用,所以类定义必须已加载(通常靠APPPATH.'libraries/...'路径下的require或 autoloader)
如何让自定义驱动被 $this->load->driver('cache') 正确识别
以扩展 cache 驱动为例,你要新增一个 apc 子驱动,但 CI 原生 Cache 库默认只认 file、memcached、redis、apc(注意:CI 3.1.11+ 才内置 apc,旧版需手动补)。
若你用的是老版本 CI,或想加一个叫 xxl 的新驱动,不能只放 drivers/xxl.php 就完事——你还得改父库源码或重载它:
- 复制
system/libraries/Cache/Cache.php到application/libraries/Cache.php - 在
Cache类中覆盖$valid_drivers,追加'xxl' - 确保
application/libraries/Cache/drivers/Xxl.php存在,且类名为Xxl - 在
Xxl.php中实现__construct()、get()、save()等必需方法(CI 会检查这些方法是否存在)
class Xxl extends CI_Driver {
public function __construct()
{
// 必须有构造函数,哪怕空着
}
public function get($id)
{
return apcu_fetch($id);
}
public function save($id, $data, $ttl = 60)
{
return apcu_store($id, $data, $ttl);
}
}
driver 加载失败的三个典型错误和对应检查点
报错往往不直接说“哪错了”,而是抛出模糊异常,比如 Call to a member function get() on null 或 Invalid driver: redis。根源基本在这三处:
-
application/libraries/Cache.php里没定义public $valid_drivers = [...];,或者数组里写了'Redis'(驼峰)但文件名是redis.php(小写) - 子驱动类没继承
CI_Driver,或类名与文件名不匹配(drivers/redis.php→ 类必须叫Redis,不能叫Cache_redis) - 子驱动方法缺失:CI 在实例化驱动前会用
method_exists($driver, 'get')等校验,缺任何一个就会跳过该驱动并静默忽略(不会报错,但后续调用就null)
CI 4 已彻底弃用 driver,别再往老机制里堆逻辑
CI 4 完全移除了 CI_Driver_Library 和 drivers/ 目录约定,转而用标准 PSR-4 + 依赖注入(DI)容器管理服务。比如缓存直接用 \CodeIgniter\Cache\CacheInterface 实现类,通过 Services::cache() 获取,可自由绑定任意实现(FileHandler、RedisHandler、甚至你自己写的 MySqlCacheHandler)。
如果你还在维护 CI 3 项目,驱动扩展是可行的,但务必接受它的硬编码限制;如果新项目或可升级,别花时间封装 CI 3 驱动——直接迁到 CI 4,或用 Laravel 的 CacheManager、Symfony Cache 组件更省心。CI 3 的驱动机制,本质上是为简化几个内置场景设计的胶水代码,不是通用扩展框架。











