# 缓存驱动器

CodeIgniter 提供了几种最常用的快速缓存的封装，除了基于文件的缓存， 其他的缓存都需要对服务器进行特殊的配置，如果配置不正确，将会抛出 一个致命错误异常（Fatal Exception）。

- 使用示例
- 类参考
- 驱动器
  - 可选 PHP 缓存（APC）
  - 基于文件的缓存
  - Memcached 缓存
  - WinCache 缓存
  - Redis 缓存
  - 虚拟缓存（Dummy Cache）

## 使用示例

下面的示例代码用于加载缓存驱动器，使用 APC 作为缓存，如果 APC 在服务器环境下不可用，将降级到基于文件的缓存。

    $this->load->driver('cache', array('adapter' => 'apc', 'backup' => 'file'));

    if ( ! $foo = $this->cache->get('foo'))
    {
        echo 'Saving to the cache!<br />';
        $foo = 'foobarbaz!';

        // Save into the cache for 5 minutes
        $this->cache->save('foo', $foo, 300);
    }

    echo $foo;

你也可以设置 key_prefix 参数来给缓存名添加前缀，当你在同一个环境下运行多个应用时，它可以避免冲突。

    $this->load->driver('cache',
        array('adapter' => 'apc', 'backup' => 'file', 'key_prefix' => 'my_')
    );

    $this->cache->get('foo'); // Will get the cache entry named 'my_foo'

## 类参考

class `CI_Cache`
  `is_supported`($driver)

    参数: | $driver (string) -- the name of the caching driver
    返回: | TRUE if supported, FALSE if not
    返回类型: | bool

    当使用 `$this->cache->get()` 方法来访问驱动器时该方法会被自动调用，但是，如果你使用了某些个人的驱动器， 应该先调用该方法确保这个驱动器在服务器环境下是否被支持。

        if ($this->cache->apc->is_supported())
        {
            if ($data = $this->cache->apc->get('my_cache'))
            {
                // do things.
            }
        }

  `get`($id)

    参数: | $id (string) -- Cache item name
    返回: | Item value or FALSE if not found
    返回类型: | mixed

    该方法用于从缓存中获取一项条目，如果获取的条目不存在，方法返回 FALSE 。

        $foo = $this->cache->get('my_cached_item');

  `save`($id, $data[, $ttl = 60[, $raw = FALSE]])

    参数: | $id (string) -- Cache item name $data (mixed) -- the data to save $ttl (int) -- Time To Live, in seconds (default 60) $raw (bool) -- Whether to store the raw value
    返回: | TRUE on success, FALSE on failure
    返回类型: | string

    该方法用于将一项条目保存到缓存中，如果保存失败，方法返回 FALSE 。

        $this->cache->save('cache_item_id', 'data_to_cache');

    注解

    参数 `$raw` 只有在使用 APC 和 Memcache 缓存时才有用， 它用于 `increment()` 和 `decrement()` 方法。

  `delete`($id)

    参数: | $id (string) -- name of cached item
    返回: | TRUE on success, FALSE on failure
    返回类型: | bool

    该方法用于从缓存中删除一项指定条目，如果删除失败，方法返回 FALSE 。

        $this->cache->delete('cache_item_id');

  `increment`($id[, $offset = 1])

    参数: | $id (string) -- Cache ID $offset (int) -- Step/value to add
    返回: | New value on success, FALSE on failure
    返回类型: | mixed

    对缓存中的值执行原子自增操作。

        // 'iterator' has a value of 2

        $this->cache->increment('iterator'); // 'iterator' is now 3

        $this->cache->increment('iterator', 3); // 'iterator' is now 6

  `decrement`($id[, $offset = 1])

    参数: | $id (string) -- Cache ID $offset (int) -- Step/value to reduce by
    返回: | New value on success, FALSE on failure
    返回类型: | mixed

    对缓存中的值执行原子自减操作。

        // 'iterator' has a value of 6

        $this->cache->decrement('iterator'); // 'iterator' is now 5

        $this->cache->decrement('iterator', 2); // 'iterator' is now 3

  `clean`()

    返回: | TRUE on success, FALSE on failure
    返回类型: | bool

    该方法用于清空整个缓存，如果清空失败，方法返回 FALSE 。

        $this->cache->clean();

  `cache_info`()

    返回: | Information on the entire cache database
    返回类型: | mixed

    该方法返回整个缓存的信息。

        var_dump($this->cache->cache_info());

    注解

    返回的信息以及数据结构取决于使用的缓存驱动器。

  `get_metadata`($id)

    参数: | $id (string) -- Cache item name
    返回: | Metadata for the cached item
    返回类型: | mixed

    该方法用于获取缓存中某个指定条目的详细信息。

        var_dump($this->cache->get_metadata('my_cached_item'));

    注解

    返回的信息以及数据结构取决于使用的缓存驱动器。

## 驱动器

### 可选 PHP 缓存（APC）

上述所有方法都可以直接使用，而不用在加载驱动器时指定 adapter 参数，如下所示:

    $this->load->driver('cache');
    $this->cache->apc->save('foo', 'bar', 10);

关于 APC 的更多信息，请参阅 http://php.net/apc

### 基于文件的缓存

和输出类的缓存不同的是，基于文件的缓存支持只缓存视图的某一部分。使用这个缓存时要注意， 确保对你的应用程序进行基准测试，因为当磁盘 I/O 频繁时可能对缓存有负面影响。

上述所有方法都可以直接使用，而不用在加载驱动器时指定 adapter 参数，如下所示:

    $this->load->driver('cache');
    $this->cache->file->save('foo', 'bar', 10);

### Memcached 缓存

可以在 memcached.php 配置文件中指定多个 Memcached 服务器，配置文件位于 application/config/ 目录。

上述所有方法都可以直接使用，而不用在加载驱动器时指定 adapter 参数，如下所示:

    $this->load->driver('cache');
    $this->cache->memcached->save('foo', 'bar', 10);

关于 Memcached 的更多信息，请参阅 http://php.net/memcached

### WinCache 缓存

在 Windows 下，你还可以使用 WinCache 缓存。

上述所有方法都可以直接使用，而不用在加载驱动器时指定 adapter 参数，如下所示:

    $this->load->driver('cache');
    $this->cache->wincache->save('foo', 'bar', 10);

关于 WinCache 的更多信息，请参阅 http://php.net/wincache

### Redis 缓存

Redis 是一个在内存中以键值形式存储数据的缓存，使用 LRU（最近最少使用算法）缓存模式， 要使用它，你需要先安装 Redis 服务器和 phpredis 扩展 。

连接 Redis 服务器的配置信息必须保存到 application/config/redis.php 文件中，可用参数有:

    $config['socket_type'] = 'tcp'; //`tcp` or `unix`
    $config['socket'] = '/var/run/redis.sock'; // in case of `unix` socket type
    $config['host'] = '127.0.0.1';
    $config['password'] = NULL;
    $config['port'] = 6379;
    $config['timeout'] = 0;

上述所有方法都可以直接使用，而不用在加载驱动器时指定 adapter 参数，如下所示:

    $this->load->driver('cache');
    $this->cache->redis->save('foo', 'bar', 10);

关于 Redis 的更多信息，请参阅 http://redis.io

### 虚拟缓存（Dummy Cache）

这是一个永远不会命中的缓存，它不存储数据，但是它允许你在当使用的缓存在你的环境下不被支持时， 仍然保留使用缓存的代码。