缓存驱动程序

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 附带几个 命令,这些命令可从命令行使用,以帮助您使用缓存。这些工具不是使用缓存驱动程序所必需的,但可能对您有所帮助。

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

虚拟缓存

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