- 数据缓存
- 片段缓存
- 页面缓存
- HTTP 缓存
缓存组件
数据缓存需要缓存组件提供支持,它代表各种缓存存储器, 例如内存,文件,数据库。
缓存组件通常注册为应用程序组件,这样 它们就可以在全局进行配置与访问。 如下代码演示了如何配置应用程序组件
cache
使用 两个memcached 服务器:'components' => [ 'cache' => [ 'class' => 'yii\caching\MemCache', 'servers' => [ [ 'host' => 'server1', 'port' => 11211, 'weight' => 100, ], [ 'host' => 'server2', 'port' => 11211, 'weight' => 50, ], ], ], ],
然后就可以通过
Yii::$app->cache
访问上面的缓存组件了。
Yii 支持一系列缓存存储器,概况如下:
- yii\caching\ApcCache:使用 PHP APC 扩展。这个选项可以 认为是集中式应用程序环境中(例如:单一服务器, 没有独立的负载均衡器等)最快的缓存方案。
- yii\caching\DbCache:使用一个数据库的表存储缓存数据。要使用这个缓存,你必须 创建一个与 yii\caching\DbCache::cacheTable 对应的表。
- yii\caching\DummyCache: 仅作为一个缓存占位符,不实现任何真正的缓存功能。 这个组件的目的是为了简化那些需要查询缓存有效性的代码。 例如,在开发中如果服务器没有实际的缓存支持,用它配置 一个缓存组件。一个真正的缓存服务启用后,可以再切换为使用相应的缓存组件。 两种条件下你都可以使用同样的代码
Yii::$app->cache->get($key)
尝试从缓存中取回数据而不用担心Yii::$app->cache
可能是null
。 - yii\caching\FileCache:使用标准文件存储缓存数据。这个特别适用于 缓存大块数据,例如一个整页的内容。
- yii\caching\MemCache:使用 PHP memcache 和 memcached 扩展。 这个选项被看作分布式应用环境中(例如:多台服务器, 有负载均衡等)最快的缓存方案。
- yii\redis\Cache:实现了一个基于 Redis 键值对存储器 的缓存组件(需要 redis 2.6.12 及以上版本的支持 )。
- yii\caching\WinCache:使用 PHP WinCache (另可参考 )扩展。
- yii\caching\XCache:使用 PHP XCache扩展。
- yii\caching\ZendDataCache:使用 Zend Data Cache 作为底层缓存媒介。
所有缓存组件都有同样的基类 yii\caching\Cache ,因此都支持如下 API:
- yii\caching\Cache::get():通过一个指定的键(key)从缓存中取回一项数据。如果该项数据 不存在于缓存中或者已经过期/失效,则返回值 false。
- yii\caching\Cache::set():将一项数据指定一个键,存放到缓存中。
- yii\caching\Cache::add():如果缓存中未找到该键,则将指定数据存放到缓存中。
- yii\caching\Cache::mget():通过指定的多个键从缓存中取回多项数据。
- yii\caching\Cache::mset():将多项数据存储到缓存中,每项数据对应一个键。
- yii\caching\Cache::madd():将多项数据存储到缓存中,每项数据对应一个键。 如果某个键已经存在于缓存中,则该项数据会被跳过。
- yii\caching\Cache::exists():返回一个值,指明某个键是否存在于缓存中。
- yii\caching\Cache::delete():通过一个键,删除缓存中对应的值。
- yii\caching\Cache::flush():删除缓存中的所有数据。
缓存过期
缓存依赖
例如:
// 创建一个对 example.txt 文件修改时间的缓存依赖 $dependency = new \yii\caching\FileDependency(['fileName' => 'example.txt']); // 缓存数据将在30秒后超时 // 如果 example.txt 被修改,它也可能被更早地置为失效状态。 $cache->set($key, $data, 30, $dependency); // 缓存会检查数据是否已超时。 // 它还会检查关联的依赖是否已变化。 // 符合任何一个条件时都会返回 false。 $data = $cache->get($key);
下面是可用的缓存依赖的概况:
- yii\caching\ChainedDependency:如果依赖链上任何一个依赖产生变化,则依赖改变。
- yii\caching\DbDependency:如果指定 SQL 语句的查询结果发生了变化,则依赖改变。
- yii\caching\ExpressionDependency:如果指定的 PHP 表达式执行结果发生变化,则依赖改变。
- yii\caching\FileDependency:如果文件的最后修改时间发生变化,则依赖改变。
- yii\caching\GroupDependency:将一项缓存数据标记到一个组名,你可以通过调用 yii\caching\GroupDependency::invalidate() 一次性将相同组名的缓存全部置为失效状态。
在视图中使用以下结构启用片段缓存:
过期时间(duration)
依赖
页面缓存指的是在服务器端缓存整个页面的内容。随后当同一个页面 被请求时,内容将从缓存中取出,而不是重新生成。$dependency = [ 'class' => 'yii\caching\DbDependency', 'sql' => 'SELECT MAX(updated_at) FROM post', ];
if ($this->beginCache($id,['duration' => 3600,'dependency' => $dependency])) { // ... 在此生成内容 ... $this->endCache(); }
页面缓存由 yii\filters\PageCache 类提供支持,该类是一个 过滤器。它可以像这样在控制器类中使用:
public function behaviors() { return [ [ 'class' => 'yii\filters\PageCache', 'only' => ['index'], 'duration' => 60, 'variations' => [ \Yii::$app->language, ], 'dependency' => [ 'class' => 'yii\caching\DbDependency', 'sql' => 'SELECT COUNT(*) FROM post', ], ], ]; }
上述代码表示页面缓存只在
index
操作时启用,页面内容最多被缓存 60 秒,会随着当前应用的语言更改而变化。如果文章总数发生变化则缓 存的页面会失效。通过配置 yii\filters\HttpCache 过滤器,控制器操作渲染的内容就能 缓存在客户端。yii\filters\HttpCache 过滤器仅对
GET
和HEAD
请求生效,它能为这些请求设置三种与缓存有关的 HTTP 头。- yii\filters\HttpCache::lastModified
- yii\filters\HttpCache::etagSeed
- yii\filters\HttpCache::cacheControlHeader
以下是使用
Last-Modified
头的示例:public function behaviors() { return [ [ 'class' => 'yii\filters\HttpCache', 'only' => ['index'], 'lastModified' => function ($action, $params) { $q = new \yii\db\Query(); return $q->from('post')->max('updated_at'); }, ], ]; }
以下是使用
ETag
头的示例:public function behaviors() { return [ [ 'class' => 'yii\filters\HttpCache', 'only' => ['view'], 'etagSeed' => function ($action, $params) { $post = $this->findModel(\Yii::$app->request->get('id')); return serialize([$post->title, $post->content]); }, ], ]; }
- 数据缓存
- 片段缓存
- 页面缓存
- HTTP 缓存