2026/10/12 8:08:55

CodeIgniter4 缓存驱动(Cache Driver)完整指南:配置、命令行与各后端实现解析

CodeIgniter4 缓存驱动(Cache Driver)完整指南:配置、命令行与各后端实现解析 后端Web框架【免费下载链接】CodeIgniter4Open Source PHP Framework (originally from EllisLab)项目地址https://gitcode.com/gh_mirrors/co/CodeIgniter4点击查看免费下载CodeIgniter4 内置的缓存驱动Caching Driver为常见的快速动态缓存后端提供了统一封装覆盖文件系统、APCu、Memcached、Redis、Predis、WinCache 与 Dummy 共 7 种实现。本文基于当前仓库的官方文档user_guide_src/source/libraries/caching.rst展开结合 app/Config/Cache.php 的真实配置与system/Cache/目录下的源码实现完整讲解配置项、命令行工具、CacheInterface全部 API以及每种驱动在源码层面的存储与过期机制。读完本文你将能够为项目选型并配置合适的缓存后端熟练运用cache()辅助函数与service(cache)两种取用方式并理解各驱动在键名校验、过期策略、原子自增自减等细节上的差异。缓存驱动概述CodeIgniter4 提供了对若干最流行的高速动态缓存形式的封装。除文件缓存外其余后端都要求特定的服务器环境如 Redis 服务端、Memcached 服务端或对应的 PHP 扩展当服务器环境不满足要求时框架会抛出 Fatal Exception致命异常。从源码看这一机制由 system/Cache/CacheFactory.php 的getHandler()实现它先检查isSupported()不通过则回退到backupHandler再失败则最终回退到dummy处理器如果初始化阶段抛出CriticalError同样会逐级回退并记录critical级别日志。缓存层以CacheInterfacesystem/Cache/CacheInterface.php为统一契约所有处理器Handler都继承自抽象基类BaseHandlersystem/Cache/Handlers/BaseHandler.php实现了get、save、delete、clean等一致的方法签名从而让上层业务代码与底层存储解耦。基本用法在控制器中最常见的使用模式是先尝试读取缓存未命中时生成数据并写入例如if (! $foo cache(foo)) { echo Saving to the cache!br; $foo foobarbaz!; // Save into the cache for 5 minutes cache()-save(foo, $foo, 300); } echo $foo;这里用到了两个形态的cache()辅助函数定义于 system/Common.phpcache(foo)传入键名等价于cache()-get(foo)返回缓存值或nullcache()不传参数时返回缓存服务对象本身CacheInterface实例。也可以直接通过全局函数service(cache)获取缓存引擎实例$cache service(cache); $foo $cache-get(foo);从源码看service(cache)由 system/Config/Services.php 提供默认返回共享单例getShared为true内部通过CacheFactory::getHandler()依据配置实例化具体处理器。因此无论通过哪种方式取用最终拿到的都是同一套经过降级逻辑选择的缓存后端。配置缓存缓存引擎的全部配置都集中在app/Config/Cache.php仓库中的实际文件即 app/Config/Cache.php。文档逐一说明了以下核心配置项结合该文件的真实定义与默认值说明如下。$handler主处理器主处理器的名称引擎启动时优先使用。可用的名称与仓库中$validHandlers的映射关系为配置值处理器类apcuCodeIgniter\Cache\Handlers\ApcuHandlerdummyCodeIgniter\Cache\Handlers\DummyHandlerfileCodeIgniter\Cache\Handlers\FileHandlermemcachedCodeIgniter\Cache\Handlers\MemcachedHandlerpredisCodeIgniter\Cache\Handlers\PredisHandlerredisCodeIgniter\Cache\Handlers\RedisHandlerwincacheCodeIgniter\Cache\Handlers\WincacheHandler仓库默认值为file。需要说明的是validHandlers也是安全边界在 CacheFactory.php 中如果$handler或$backup不在该数组内会抛出CacheException::forHandlerNotFound()数组为空时抛出CacheException::forInvalidHandlers()。$backupHandler备用处理器当首选$handler不可用时加载的下一个缓存处理器。文档建议常用file处理器作为后备因为文件系统几乎总是可用但对于更复杂的多服务器部署场景文件后端可能并不合适。仓库默认值为dummy。根据 CacheFactory.php 的源码降级链是首选 → 备用 → dummy且初始化抛出CriticalError时同样会走这条链。$prefix键名前缀如果多个应用共享同一份缓存存储可以在此设置自定义前缀字符串框架会将其前置到所有键名前。仓库默认值为空字符串。从BaseHandler::validateKey()看前缀参与键名的长度计算各 Handler 在get/save/delete等操作前都会调用static::validateKey($key, $this-prefix)完成拼接与校验。$ttl默认存活时间未显式指定时缓存项保存的默认秒数。仓库默认值为60。注意当前框架内建的 Handler 并未使用该值——save()的默认 TTL 参数在接口中硬编码为 60 秒见 CacheInterface.php 的save(string $key, mixed $value, int $ttl 60)。该配置对第三方项目和模块可能有用未来版本中会替换掉硬编码值。$file文件处理器设置针对File处理器的一组设置决定缓存文件如何保存。仓库中的真实定义public array $file [ storePath WRITEPATH . cache/, mode 0640, ];其中storePath是缓存文件存储目录默认指向writable/cache/mode是写入文件的权限模式八进制。从 FileHandler.php 的构造函数可见配置会与默认值[storePath WRITEPATH . cache, mode 0640]合并且目录不可写时会抛出CacheException::forUnableToWrite()。$memcachedMemcached 服务器设置使用Memcached处理器时的一组服务器配置。仓库默认值public array $memcached [ host 127.0.0.1, port 11211, weight 1, raw false, ];raw为true时启用 Memcached 二进制协议Memcached::OPT_BINARY_PROTOCOL并让存储值不再被额外包装详见后文 Memcached 一节。$redisRedis 服务器设置使用Redis与Predis处理器时的 Redis 服务器设置。仓库默认值public array $redis [ host 127.0.0.1, password null, port 6379, timeout 0, async false, // specific to Predis and ignored by the native Redis extension persistent false, database 0, ];其中async仅对 Predis 客户端有意义原生 phpredis 扩展会忽略它persistent决定是否使用长连接database是选中的 Redis 逻辑库编号。仓库配置中的其他相关项原文档未展开、但在仓库配置中同样存在且与缓存运行直接相关的项包括reservedCharacters键名与标签中不允许出现的保留字符默认{}()/\:该集合是 PSR-6 合规所要求的违反时各处理器会抛出异常校验逻辑在 BaseHandler.php。validHandlers允许使用的处理器别名与类名映射见上文表格。cacheQueryStringWeb 页面缓存是否将 URL 查询字符串计入缓存文件生成false禁用true全量计入也可传入白名单数组如[q]。cacheStatusCodes允许被 PageCache 过滤器缓存响应的 HTTP 状态码白名单默认[]表示缓存所有状态码向后兼容生产环境建议[200]以避免把 404、500 等临时错误页缓存起来。命令行工具CodeIgniter4 自带若干命令行命令完整列表见 user_guide_src/source/cli/spark_commands.rst用于辅助操作缓存。这些工具并非使用缓存驱动所必需但可以协助日常维护。cache:clear —— 清空当前系统缓存在项目根目录执行php spark cache:clear该命令由 system/Commands/Cache/ClearCache.php 实现。源码细节值得注意支持可选的driver参数cache:clear [driver]指定要清理的缓存驱动默认使用配置中的主处理器会校验驱动名是否在validHandlers中否则输出错误并返回EXIT_ERROR实际调用service(cache, $config)-clean()当清理的是file处理器且定位器使用FileLocatorCached时还会同步删除定位器自身的缓存文件。cache:info —— 显示文件缓存信息php spark cache:info该命令由 system/Commands/Cache/InfoCache.php 实现展示当前系统中文件缓存的信息输出一个包含 Name、Server Path、Size、Date 四列的控制台表格。需要特别留意注意此命令只支持 File 缓存处理器。源码中在$config-handler ! file时会直接报错退出This command only supports the file cache handler.。类参考CacheInterface 全部方法CodeIgniter\Cache\CacheInterface是缓存层的统一接口以下逐一说明其方法签名、返回类型与语义并附带原文档的示例与仓库实现依据。isSupported()返回true表示支持false表示不支持类型bool判断当前系统是否支持该驱动。例如 FileHandler 检查存储目录是否可写FileHandler.phpRedisHandler 检查redis扩展是否已加载RedisHandler.phpMemcachedHandler 检查memcached或memcache扩展MemcachedHandler.php。get(string $key): mixed参数string $key缓存项名称返回缓存项的值若不存在返回null尝试从缓存存储中获取一个缓存项。若不存在返回null。示例$foo $cache-get(my_cached_item);底层实现上FileHandler 会反序列化缓存文件并校验time/ttl字段过期则删除文件并返回null见 FileHandler.phpRedisHandler 使用hMget($key, [__ci_type, __ci_value])按类型还原数据。remember(string $key, int $ttl, Closure $callback)参数string $key缓存项名称int $ttl存活秒数Closure $callback缓存未命中时执行的回调返回缓存项的值先从缓存中取项若返回null则调用回调并把结果保存随后返回该值。通用实现位于 BaseHandler.php。值得注意的是 APCu 处理器对remember()做了特化直接使用apcu_entry()原子性避免并发重复计算见 ApcuHandler.php。save(string $key, $data[, int $ttl 60])参数string $key缓存项名称mixed $data要保存的数据int $ttl存活秒数默认 60返回成功true失败false把缓存项保存到缓存存储。保存失败返回false。示例$cache-save(cache_item_id, data_to_cache);文件处理器会把数据连同time写入时刻与ttl序列化落盘FileHandler.phpRedis 处理器则写入__ci_type/__ci_value两个哈希字段并在$ttl ! 0时用expireAt()设定绝对过期时间RedisHandler.php。delete(string $key): bool参数string $key缓存项名称返回成功true失败false删除指定缓存项。删除失败返回false。示例$cache-delete(cache_item_id);deleteMatching(string $pattern): integer参数string $pattern匹配缓存项键名的 glob 风格模式返回被删除的缓存项数量一次性删除多个匹配键的缓存项返回删除总数。示例$cache-deleteMatching(prefix_*); // deletes all items of which keys start with prefix_ $cache-deleteMatching(*_suffix); // deletes all items of which keys end with _suffix重要该方法仅对 File、Redis 和 Predis 处理器实现。由于后端限制Memcached 与 WinCache 处理器无法实现——从源码看MemcachedHandler::deleteMatching()与WincacheHandler::deleteMatching()都会直接抛出BadMethodCallExceptionMemcachedHandler.php、WincacheHandler.php。glob 风格的语法可参考维基百科「Glob (programming)」词条的语法说明。各实现的差异也值得了解FileHandler 直接用glob($this-path . $pattern, GLOB_NOSORT)匹配文件FileHandler.phpRedisHandler 使用scan()游标迭代配合模式匹配后批量delRedisHandler.phpApcuHandler 则用APCUIterator遍历键并fnmatch过滤。increment($key[, $offset 1]): mixed参数string $key缓存 IDint $offset增加步长返回成功时新值失败false对原始存储值执行原子自增。示例// iterator has a value of 2 $cache-increment(iterator); // iterator is now 3 $cache-increment(iterator, 3); // iterator is now 6Redis 处理器通过hIncrBy($key, __ci_value, $offset)实现真正原子操作RedisHandler.phpFileHandler 则是读-改-写先读取项若不存在则初始化为 0TTL 60值非整数时返回falseFileHandler.php。decrement($key[, $offset 1]): mixed参数string $key缓存 IDint $offset减少步长返回成功时新值失败false对原始存储值执行原子自减。示例// iterator has a value of 6 $cache-decrement(iterator); // iterator is now 5 $cache-decrement(iterator, 2); // iterator is now 3重要Memcached 计数器是无符号的会在0处饱和而不会变成负数。对不存在的键执行decrement会将其初始化为0而不是像 File、Redis、Predis 处理器那样初始化为-$offset对已有计数器减到0以下时会被钳制在0。这一行为在 MemcachedHandler.php 的源码注释中有明确说明且注意 Memcached 的increment/decrement仅在raw配置为true时才可用。clean()返回成功true失败false类型bool清理整个缓存。删除缓存文件失败时返回false。示例$cache-clean();FileHandler 调用delete_files()清空缓存目录FileHandler.phpRedisHandler 调用flushDB()RedisHandler.phpMemcachedHandler 调用flush()。getCacheInfo()返回整个缓存数据库的信息类型mixed返回整个缓存的信息。示例var_dump($cache-getCacheInfo());注意返回信息的结构与内容取决于所使用的适配器。例如 FileHandler 返回目录文件信息数组get_dir_file_info()RedisHandler 返回info()统计MemcachedHandler 返回getStats()。getMetadata(string $key)参数string $key缓存项名称返回缓存项的元数据缺失项返回null存在时返回至少包含expire键的数组expire为绝对 epoch 过期时间戳永不过期时为null类型array|null返回某个缓存项的详细信息。示例var_dump($cache-getMetadata(my_cached_item));注意返回的信息与数据结构同样取决于适配器。部分适配器File、Memcached、Wincache对缺失项仍返回false而非null——使用时需注意兼容性判断。以 FileHandler 为例FileHandler.php返回数组包含expiretime ttlttl 0时为null、mtime文件修改时间与data。validateKey(string $key, string $prefix)静态方法参数string $key候选缓存键string $prefix可选前缀返回经校验并加前缀的键名若键名超过驱动的最大键长会被哈希处理类型string处理器内部用来校验键名合法性的方法。对非字符串、含非法字符、空键名会抛出InvalidArgumentException。示例use CodeIgniter\Cache\Handlers\BaseHandler; $prefixedKey BaseHandler::validateKey($key, $prefix);源码实现位于 BaseHandler.php依次校验是否为字符串、是否为空、是否包含reservedCharacters保留字符当strlen($prefix . $key)超过MAX_KEY_LENGTH时返回$prefix . md5($key)。注意各驱动可覆盖最大键长例如 FileHandler 定义为255BaseHandler 默认为PHP_INT_MAX。驱动详解APCu 缓存内存键值存储APCu 是 PHP 的内存键值存储。使用它需要安装 APCu PHP 扩展。处理器位于 system/Cache/Handlers/ApcuHandler.php底层调用apcu_fetch、apcu_store、apcu_delete、apcu_entry等函数并支持用APCUIterator实现键名匹配删除。文件缓存File-based文件缓存要求一个应用可写的缓存目录。仓库默认存储路径为WRITEPATH . cache/即writable/cache/文件权限默认0640。磁盘 I/O 会在某一点上抵消缓存带来的收益因此文档建议谨慎使用并务必对应用做基准测试benchmark。文件存储格式为序列化后的[time 写入时间戳, ttl 存活秒数, data 数据]三元组FileHandler.php读取时会校验 TTL 并惰性删除过期文件FileHandler.php。文件缓存的键名最大长度为 255。Memcached 缓存Memcached 服务器可在缓存配置文件中指定。可用配置项即上文$memcached数组完整示例namespace Config; use CodeIgniter\Config\BaseConfig; class Cache extends BaseConfig { // ... public $memcached [ host 127.0.0.1, port 11211, weight 1, raw false, ]; // ... }处理器源码system/Cache/Handlers/MemcachedHandler.php同时兼容Memcached与Memcache两类扩展优先使用Memcached其次Memcache两者都不可用时抛出CriticalError。非raw模式下存储值会被包装为[值, 写入时间戳, ttl]三元数组以便计算元数据raw模式则原样存储并启用二进制协议。WinCache 缓存在 Windows 环境下可以使用 WinCache 驱动。处理器位于 system/Cache/Handlers/WincacheHandler.php底层调用wincache_ucache_*系列函数。如前所述它不支持deleteMatching()。Redis 缓存Redis 是内存键值存储可以工作在 LRU 缓存模式下。使用它需要 Redis 服务端与 phpredis PHP 扩展。连接配置存放在缓存配置文件中可用配置项完整示例namespace Config; use CodeIgniter\Config\BaseConfig; class Cache extends BaseConfig { // ... public $redis [ host 127.0.0.1, password null, port 6379, async false, // specific to Predis and ignored by the native Redis extension persistent false, timeout 0, database 0, ]; // ... }处理器源码system/Cache/Handlers/RedisHandler.php的关键行为包括初始化时依次执行连接支持 Unix socket此时端口按 0 处理、认证auth、选库select任一步骤失败都会抛出CriticalError进而触发CacheFactory的降级链数据以哈希hash形式存储通过__ci_type/__ci_value两个字段保留类型信息clean()等价于flushDB()还提供了ping()与reconnect()用于持久连接的存活探测与重连。Predis 缓存Predis 是 Redis 键值存储的功能完备的 PHP 客户端库。使用前需要在项目根目录执行composer require predis/predis处理器位于 system/Cache/Handlers/PredisHandler.php复用$redis配置中的host、port、password、timeout、async、persistent等选项其内部默认配置还包含scheme tcp。同样支持deleteMatching()通过Keyspace迭代器遍历键名实现。Dummy 缓存Dummy 是一个永远「未命中」miss的缓存后端。它不存储任何数据但允许在所选缓存不受支持的环境中保留缓存代码不动。处理器位于 system/Cache/Handlers/DummyHandler.phpget()恒返回nullsave()/delete()/clean()恒返回truegetCacheInfo()与getMetaData()恒返回null。同时它也是CacheFactory降级链的最终兜底处理器保证应用在没有任何可用缓存后端时也不会因缓存代码而崩溃。小结通过本指南可以明确CodeIgniter4 的缓存层以CacheInterface为契约、以CacheFactory为装配入口提供了从「应用内便捷函数」到「可替换后端」的完整能力闭环。配置上只需维护 app/Config/Cache.php 中的主/备处理器、前缀、TTL 及各后端连接参数运维上可借助cache:clear与cache:info两个 Spark 命令编码上应留意deleteMatching()与原子自增自减在不同后端间的能力与行为差异Memcached 的饱和语义、部分处理器不支持模式删除等据此选择与业务匹配的后端并在切换后端时验证getCacheInfo()/getMetadata()的返回结构差异。赞分享后端Web框架【免费下载链接】CodeIgniter4Open Source PHP Framework (originally from EllisLab)项目地址https://gitcode.com/gh_mirrors/co/CodeIgniter4点击查看免费下载相关推荐Hyperf 缓存组件hyperf/cache完全指南切面缓存注解、PSR-16 与多驱动配置实战Hyperf 缓存组件hyperf/cache完全指南切面缓存注解、PSR 16 与多驱动配置实战 本文全面讲解 Hyperf 框架的 hyperf/ca后端Web框架微服务RPC框架异步编程Ghost 内部缓存适配器Internal Cache Adapters完整解析默认/命名缓存、MemoryCache 与 Redis 配置及自定义实现Ghost 内部缓存适配器Internal Cache Adapters完整解析默认/命名缓存、MemoryCache 与 Redis 配置及自定义实现CMS后端前端Faust Web 内存缓存后端memory cache backend完全指南CacheStorage 实现、TTL 机制与视图缓存实战Faust Web 内存缓存后端memory cache backend完全指南CacheStorage 实现、TTL 机制与视图缓存实战 导读 本文围绕流处理消息队列后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考