缓存驱动
CodeIgniter 封装了多种流行的快速动态缓存方式。除基于文件的缓存外,其他缓存方式都需要特定的服务器环境支持,若服务器环境不满足要求,将抛出致命异常。
使用示例
以下示例展示在控制器中的常见用法。
<?php
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;
可通过全局函数 service() 直接获取缓存引擎实例:
<?php
$cache = service('cache');
$foo = $cache->get('foo');
配置缓存
缓存引擎的所有配置均在 app/Config/Cache.php 文件中完成。该文件包含以下配置项:
$handler
指定启动缓存引擎时使用的首要处理器名称。 可用名称包括:apcu、dummy、file、memcached、redis、predis、wincache。
$backupHandler
当首选 $handler 不可用时,将加载此备用缓存处理器。
通常使用 File 处理器,因为文件系统始终可用,但在复杂的多服务器环境中可能不适用。
$prefix
当多个应用共用同一缓存存储时,可在此处添加自定义前缀字符串,该前缀将添加到所有键名之前。
$ttl
未指定保存时间时的默认秒数。
警告:框架处理器未使用此配置(硬编码为 60 秒),但可能对项目和模块有用。未来版本将替换该硬编码值。
$file
专用于 File 处理器的设置数组,用于确定缓存文件的保存方式。
$memcached
使用 Memcached 处理器时的服务器数组。
$redis
使用 Redis 和 Predis 处理器时的 Redis 服务器设置。
命令行工具
CodeIgniter 内置多个 命令,可从命令行辅助使用缓存。 这些工具不是使用缓存驱动的必需组件,但可能有所帮助。
cache:clear
清除当前系统缓存:
php spark cache:clear
cache:info
显示当前系统的文件缓存信息:
php spark cache:info
备注
此命令仅支持 File 缓存处理器。
类参考
- class CodeIgniter\Cache\CacheInterface
- isSupported()
- 返回:
支持返回
true,不支持返回false- 返回类型:
bool
- get($key) mixed
- 参数:
$key (
string) -- 缓存项名称
- 返回:
项值,未找到返回
null- 返回类型:
mixed
尝试从缓存存储中获取项。若项不存在,返回 null。
示例:
<?php $foo = $cache->get('my_cached_item');
- remember(string $key, int $ttl, Closure $callback)
- 参数:
$key (
string) -- 缓存项名称$ttl (
int) -- 存活时间(秒)$callback (
Closure) -- 缓存项返回 null 时调用的回调
- 返回:
缓存项的值
- 返回类型:
mixed
从缓存获取项。若返回
null,将调用回调并保存结果。无论哪种情况,均返回值。
- save(string $key, $data[, int $ttl = 60])
- 参数:
$key (
string) -- 缓存项名称$data (
mixed) -- 要保存的数据$ttl (
int) -- 存活时间(秒,默认 60)
- 返回:
成功返回
true,失败返回false- 返回类型:
bool
将项保存到缓存存储。保存失败返回
false。示例:
<?php $cache->save('cache_item_id', 'data_to_cache');
- delete($key) bool
- 参数:
$key (
string) -- 缓存项名称
- 返回:
成功返回
true,失败返回false- 返回类型:
bool
从缓存存储删除指定项。删除失败返回 false。
示例:
<?php $cache->delete('cache_item_id');
- deleteMatching($pattern) integer
- 参数:
$pattern (
string) -- 匹配缓存项键的 glob 风格模式
- 返回:
删除的项数
- 返回类型:
integer
通过 glob 风格模式匹配键,从缓存存储批量删除多项。返回删除项的总数。
重要
此方法仅在 File、Redis 和 Predis 处理器中实现。 由于限制,无法在 Memcached 和 Wincache 处理器中实现。
示例:
<?php $cache->deleteMatching('prefix_*'); // deletes all items of which keys start with "prefix_" $cache->deleteMatching('*_suffix'); // deletes all items of which keys end with "_suffix"
关于 glob 风格语法的更多信息,请参见 Glob (programming)。
- increment($key[, $offset = 1]) mixed
- 参数:
$key (
string) -- 缓存 ID$offset (
int) -- 增加步长/值
- 返回:
成功返回新值,失败返回
false- 返回类型:
mixed
对原始存储值执行原子递增。
示例:
<?php // 'iterator' has a value of 2 $cache->increment('iterator'); // 'iterator' is now 3 $cache->increment('iterator', 3); // 'iterator' is now 6
- decrement($key[, $offset = 1]) mixed
- 参数:
$key (
string) -- 缓存 ID$offset (
int) -- 减少步长/值
- 返回:
成功返回新值,失败返回
false- 返回类型:
mixed
对原始存储值执行原子递减。
示例:
<?php // 'iterator' has a value of 6 $cache->decrement('iterator'); // 'iterator' is now 5 $cache->decrement('iterator', 2); // 'iterator' is now 3
- clean()
- 返回:
成功返回
true,失败返回false- 返回类型:
bool
"清理"整个缓存。缓存文件删除失败返回 false。
示例:
<?php $cache->clean();
- getCacheInfo()
- 返回:
整个缓存数据库的信息
- 返回类型:
mixed
返回整个缓存的信息。
示例:
<?php var_dump($cache->getCacheInfo());
备注
返回的信息和数据结构取决于所使用的适配器。
- getMetadata(string $key)
- 参数:
$key (
string) -- 缓存项名称
- 返回:
缓存项的元数据。缺失项返回
null,或返回至少包含 "expire" 键(绝对 Unix 过期时间,永不过期则为null)的数组。- 返回类型:
array|null
返回缓存中指定项的详细信息。
示例:
<?php var_dump($cache->getMetadata('my_cached_item'));
备注
返回的信息和数据结构取决于所使用的适配器。部分适配器(File、Memcached、Wincache) 对缺失项仍返回
false。
- static validateKey(string $key, string $prefix)
- 参数:
$key (
string) -- 候选缓存键$prefix (
string) -- 可选前缀
- 返回:
验证并添加前缀的键。若键超出驱动最大键长度,将进行哈希。
- 返回类型:
string
处理器方法使用此方法验证键是否有效。非字符串、无效字符和空长度将抛出
InvalidArgumentException。示例:
<?php use CodeIgniter\Cache\Handlers\BaseHandler; $prefixedKey = BaseHandler::validateKey($key, $prefix);
驱动
APCu 缓存
APCu 是适用于 PHP 的内存键值存储。
使用此功能需安装 APCu PHP 扩展。
基于文件的缓存
需要缓存目录对应用可写。
谨慎使用,并确保对应用进行基准测试,因为磁盘 I/O 可能抵消缓存带来的性能提升。
Memcached 缓存
Memcached 服务器可在缓存配置文件中指定。可用选项如下:
<?php
namespace Config;
use CodeIgniter\Config\BaseConfig;
class Cache extends BaseConfig
{
// ...
public $memcached = [
'host' => '127.0.0.1',
'port' => 11211,
'weight' => 1,
'raw' => false,
];
// ...
}
关于 Memcached 的更多信息,请参见 https://www.php.net/memcached。
WinCache 缓存
在 Windows 下,也可使用 WinCache 驱动。
关于 WinCache 的更多信息,请参见 https://www.php.net/wincache。
Redis 缓存
Redis 是一个内存键值存储,可在 LRU 缓存模式下运行。 使用需 Redis 服务器和 phpredis PHP 扩展。
连接 Redis 服务器的配置选项存储在缓存配置文件中。可用选项如下:
<?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,
];
// ...
}
关于 Redis 的更多信息,请参见 https://redis.io。
Predis 缓存
Predis 是一个灵活且功能完整的 Redis 键值存储 PHP 客户端库。 使用前需先在项目根目录执行:
composer require predis/predis
关于 Redis 的更多信息,请参见 https://github.com/nrk/predis。
Dummy 缓存
这是一个始终"未命中"的缓存后端。不存储任何数据, 但可以在不支持所选缓存的环境中保留缓存代码。