缓存驱动
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 提供了几个可以从命令行使用的 commands,以帮助你使用缓存。 这些工具不是使用缓存驱动所必需的,但可能对你有帮助。
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 样式模式
- 返回
已删除项的数量
- 返回类型
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” 键的数组。- 返回类型
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 $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://www.php.net/memcached。
WinCache 缓存
在 Windows 下,你也可以使用 WinCache 驱动程序。
有关 WinCache 的更多信息,请查看 https://www.php.net/wincache。
Redis 缓存
Redis 是一个内存中的键值存储,可以以 LRU 缓存模式运行。要使用它,你需要 Redis server 和 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.io。
Predis 缓存
Predis 是一个用于 Redis 键值存储的灵活且功能完善的 PHP 客户端库。要使用它,从项目根目录的命令行中运行:
> composer require predis/predis
有关 Redis 的更多信息,请查看 https://github.com/nrk/predis。
Dummy 缓存
这是一个缓存后端,将始终“未命中”。它不存储任何数据,但允许你在不支持你选择的缓存的环境中保持缓存代码。