缓存驱动

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

使用 RedisPredis 处理程序时,希望使用的 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

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://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 缓存

这是一个缓存后端,将始终“未命中”。它不存储任何数据,但允许你在不支持你选择的缓存的环境中保持缓存代码。