缓存驱动程序
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;
您可以通过 Services 类直接获取缓存引擎的实例
<?php
$cache = \Config\Services::cache();
$foo = $cache->get('foo');
配置缓存
缓存引擎的所有配置都在 app/Config/Cache.php 中完成。在该文件中,可以使用以下项目。
$handler
这是启动引擎时应使用的处理程序的名称。可用的名称有:dummy、file、memcached、redis、predis、wincache。
$backupHandler
如果第一个选择 $handler
不可用,则这是要加载的下一个缓存处理程序。这通常是 File
处理程序,因为文件系统始终可用,但可能不适合更复杂的、多服务器的设置。
$prefix
如果您有多个应用程序使用相同的缓存存储,您可以在此处添加一个自定义前缀字符串,该字符串将附加到所有键名之前。
$ttl
未指定时保存项目的默认秒数。
警告:框架处理程序不使用此值,其中 60 秒是硬编码的,但这可能对项目和模块有用。这将在未来版本中替换硬编码值。
$file
这是一个特定于 File
处理程序的设置数组,用于确定它应该如何保存缓存文件。
$memcached
这是一个服务器数组,将在使用 Memcache(d)
处理程序时使用。
$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[, $raw = false]])
- 参数:
$key (
string
) – 缓存项名称$data (
mixed
) – 要保存的数据$ttl (
int
) – 生存时间,以秒为单位(默认 60)$raw (
bool
) – 是否存储原始值
- 返回:
成功时为
true
,失败时为false
- 返回类型:
bool
此方法将把一个项目保存到缓存存储中。如果保存失败,该方法将返回
false
。示例
<?php $cache->save('cache_item_id', 'data_to_cache');
注意
参数
$raw
仅由 Memcache 使用,以允许使用increment()
和decrement()
。
- delete($key) bool
- 参数:
$key (
string
) – 缓存项目的名称
- 返回:
成功时为
true
,失败时为false
- 返回类型:
bool
此方法将从缓存存储中删除一个特定项目。如果项目删除失败,该方法将返回 false。
示例
<?php $cache->delete('cache_item_id');
- deleteMatching($pattern) integer
- 参数:
$pattern (
string
) – 与缓存项目键匹配的 glob 样式模式
- 返回:
已删除项目的数量
- 返回类型:
整数
此方法将通过将它们的键与 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 (编程)。
- 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”键的数组,用于表示绝对的 epoch 过期时间(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);
驱动程序
基于文件的缓存
与 Output 类中的缓存不同,基于文件的驱动程序缓存允许缓存视图文件的部分内容。谨慎使用此功能,并确保对应用程序进行基准测试,因为磁盘 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://php.ac.cn/memcached。
WinCache 缓存
在 Windows 下,您也可以使用 WinCache 驱动程序。
有关 WinCache 的更多信息,请参阅 https://php.ac.cn/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,
'timeout' => 0,
'database' => 0,
];
// ...
}
有关 Redis 的更多信息,请参阅 https://redis.ac.cn。
Predis 缓存
Predis 是一个灵活且功能齐全的 PHP 客户端库,用于 Redis 键值存储。要使用它,从项目根目录中的命令行
composer require predis/predis
有关 Redis 的更多信息,请参阅 https://github.com/nrk/predis。
虚拟缓存
这是一个始终“未命中”的缓存后端。它不存储任何数据,但允许您在不支持所选缓存的环境中保留缓存代码。