@ -5,8 +5,8 @@
它也是更高级缓存特性的基础,例如[查询缓存](#query-caching)
它也是更高级缓存特性的基础,例如[查询缓存](#query-caching)
和[内容缓存](caching-content.md)。
和[内容缓存](caching-content.md)。
如下代码是一个典型的数据缓存使用模式。其中 `$cache` 指向
如下代码是一个典型的数据缓存使用模式。
[缓存组件 ](#cache-components ):
其中 `$cache` 指向[缓存组件](#cache-components ):
```php
```php
// 尝试从缓存中取回 $data
// 尝试从缓存中取回 $data
@ -23,16 +23,35 @@ if ($data === false) {
// 这儿 $data 可以使用了。
// 这儿 $data 可以使用了。
```
```
从2.0.11版本开始, [缓存组件 ](#cache-components ) 提供了[[yii\caching\Cache::getOrSet()|getOrSet()]] 方法来简化数据的取回、计算和存储。下面的代码逻辑和上一个例子是完全一样的:
```php
$data = $cache->getOrSet($key, function () {
return $this->calculateSomething();
});
```
当缓存中有关联$key的数据时,将返回这个缓存的值。否则就执行匿名函数来计算出将要缓存的数据并返回它。
如果匿名函数需要作用域外的数据时,可以使用`use`语句把这些数据传递到匿名函数中。例如:
```php
$user_id = 42;
$data = $cache->getOrSet($key, function () use ($user_id) {
return $this->calculateSomething($user_id);
});
```
> 注意: [[yii\caching\Cache::getOrSet()|getOrSet()]] 方法也支持缓存持续性和缓存依赖。请看[缓存过期](#cache-expiration) 和 [缓存依赖 ](#cache-dependencies ) 来了解详细信息。
## 缓存组件 < span id = "cache-components" > < / span >
## 缓存组件 < span id = "cache-components" > < / span >
数据缓存需要**缓存组件**提供支持,它代表各种缓存存储器,
数据缓存需要**缓存组件**提供支持,它代表各种缓存存储器,
例如内存,文件,数据库。
例如内存,文件,数据库。
缓存组件通常注册为应用程序组件,这样
缓存组件通常注册为应用程序组件,这样它们就可以
它们就可以在全局进行配置与访问。
在全局进行配置与访问。如下代码演示了如何配置应用程序组件
如下代码演示了如何配置应用程序组件 `cache` 使用
`cache` 使用两个 [memcached ](http://memcached.org/ )
两个 [memcached ](http://memcached.org/ ) 服务器:
服务器:
```php
```php
'components' => [
'components' => [
@ -56,8 +75,8 @@ if ($data === false) {
然后就可以通过 `Yii::$app->cache` 访问上面的缓存组件了。
然后就可以通过 `Yii::$app->cache` 访问上面的缓存组件了。
由于所有缓存组件都支持同样的一系列 API ,并不需要修改使用缓存的
由于所有缓存组件都支持同样的一系列 API ,并不需要修改使用缓存的业务代码
业务代码 就能直接替换为其他底层缓存组件,只需在应用配置中重新配置一下就可以。
就能直接替换为其他底层缓存组件,只需在应用配置中重新配置一下就可以。
例如,你可以将上述配置修改为使用 [[yii\caching\ApcCache|APC cache]]:
例如,你可以将上述配置修改为使用 [[yii\caching\ApcCache|APC cache]]:
@ -69,7 +88,7 @@ if ($data === false) {
],
],
```
```
> Tip : 你可以注册多个缓存组件,很多依赖缓存的类默认调用
> 提示 : 你可以注册多个缓存组件,很多依赖缓存的类默认调用
名为 `cache` 的组件(例如 [[yii\web\UrlManager]])。
名为 `cache` 的组件(例如 [[yii\web\UrlManager]])。
@ -77,66 +96,65 @@ if ($data === false) {
Yii 支持一系列缓存存储器,概况如下:
Yii 支持一系列缓存存储器,概况如下:
* [[yii\caching\ApcCache]]:使用 PHP [APC ](http://php.net/manual/en/book.apc.php ) 扩展。这个选项可以
* [[yii\caching\ApcCache]]:使用 PHP [APC ](http://php.net/manual/en/book.apc.php ) 扩展。
认为是集中式应用程序环境中(例如:单一服务器,
这个选项可以 认为是集中式应用程序环境中
没有独立的负载均衡器等)最快的缓存方案。
(例如:单一服务器, 没有独立的负载均衡器等)最快的缓存方案。
* [[yii\caching\DbCache]]:使用一个数据库的表存储缓存数据。要使用这个缓存,你必须
* [[yii\caching\DbCache]]:使用一个数据库的表存储缓存数据。要使用这个缓存,
创建一个与 [[yii\caching\DbCache::cacheTable]] 对应的表。
你必须 创建一个与 [[yii\caching\DbCache::cacheTable]] 对应的表。
* [[yii\caching\DummyCache]]: 仅作为一个缓存占位符,不实现任何真正的缓存功能。
* [[yii\caching\DummyCache]]: 仅作为一个缓存占位符,不实现任何真正的缓存功能。
这个组件的目的是为了简化那些需要查询缓存有效性的代码。
这个组件的目的是为了简化那些需要查询缓存有效性的代码。例如,
例如, 在开发中如果服务器没有实际的缓存支持,用它配置
在开发中如果服务器没有实际的缓存支持,用它配置一个缓存组件。
一个缓存组件。一个 真正的缓存服务启用后,可以再切换为使用相应的缓存组件。
一个真正的缓存服务启用后,可以再切换为使用相应的缓存组件。
两种条件下你都可以使用同样的代码
两种条件下你都可以使用同样的代码
`Yii::$app->cache->get($key)` 尝试从缓存中取回数据而不用担心
`Yii::$app->cache->get($key)` 尝试从缓存中取回数据而不用担心
`Yii::$app->cache` 可能是 `null` 。
`Yii::$app->cache` 可能是 `null` 。
* [[yii\caching\FileCache]]:使用标准文件存储缓存数据。这个特别适用于
* [[yii\caching\FileCache]]:使用标准文件存储缓存数据。
缓存大块数据,例如一个整页的内容。
这个特别适用于 缓存大块数据,例如一个整页的内容。
* [[yii\caching\MemCache]]:使用 PHP [memcache ](http://php.net/manual/en/book.memcache.php )
* [[yii\caching\MemCache]]:使用 PHP [memcache ](http://php.net/manual/en/book.memcache.php )
和 [memcached ](http://php.net/manual/en/book.memcached.php ) 扩展。
和 [memcached ](http://php.net/manual/en/book.memcached.php ) 扩展。
这个选项被看作分布式应用环境中(例如:多台服务器,
这个选项被看作分布式应用环境中(例如:多台服务器,有负载均衡等)
有负载均衡等) 最快的缓存方案。
最快的缓存方案。
* [[yii\redis\Cache]]:实现了一个基于 [Redis ](http://redis.io/ ) 键值对存储器
* [[yii\redis\Cache]]:实现了一个基于 [Redis ](http://redis.io/ ) 键值对存储器的缓存组件
的缓存组件 (需要 redis 2.6.12 及以上版本的支持 )。
(需要 redis 2.6.12 及以上版本的支持 )。
* [[yii\caching\WinCache]]:使用 PHP [WinCache ](http://iis.net/downloads/microsoft/wincache-extension )
* [[yii\caching\WinCache]]:使用 PHP [WinCache ](http://iis.net/downloads/microsoft/wincache-extension )
([另可参考](http://php.net/manual/en/book.wincache.php) )扩展。
([另可参考](http://php.net/manual/en/book.wincache.php))扩展.
* [[yii\caching\XCache]]:使用 PHP [XCache ](http://xcache.lighttpd.net/ )扩展。
* [[yii\caching\XCache]]:使用 PHP [XCache ](http://xcache.lighttpd.net/ )扩展。
* [[yii\caching\ZendDataCache]]:使用
* [[yii\caching\ZendDataCache]]:使用
[Zend Data Cache ](http://files.zend.com/help/Zend-Server-6/zend- server.htm#data_cache_component.htm )
[Zend Data Cache ](http://files.zend.com/help/Zend-Server-6/zend- server.htm#data_cache_component.htm )
作为底层缓存媒介。
作为底层缓存媒介。
> Tip : 你可以在同一个应用程序中使用不同的缓存存储器。一个常见的策略是使用基于内存的缓存存储器
> 提示 : 你可以在同一个应用程序中使用不同的缓存存储器。一个常见的策略是使用基于内存的缓存存储器
存储小而常用的数据(例如:统计数据),使用基于文件
存储小而常用的数据(例如:统计数据),使用基于文件或数据库的缓存存储器
或数据库的缓存存储器 存储大而不太常用的数据(例如:网页内容)。
存储大而不太常用的数据(例如:网页内容)。
## 缓存 API < span id = "cache-apis" > < / span >
## 缓存 API < span id = "cache-apis" > < / span >
所有缓存组件都有同样的基类 [[yii\caching\Cache]] ,因此都支持如下 API:
所有缓存组件都有同样的基类 [[yii\caching\Cache]] ,因此都支持如下 API:
* [[yii\caching\Cache::get()|get()]]:通过一个指定的键(key)从缓存中取回一项数据。如果该项数据
* [[yii\caching\Cache::get()|get()]]:通过一个指定的键(key)从缓存中取回一项数据。
不存在于缓存中或者已经过期/失效,则返回值 false。
如果该项数据 不存在于缓存中或者已经过期/失效,则返回值 false。
* [[yii\caching\Cache::set()|set()]]:将一项数据指定一个键, 存放到缓存中。
* [[yii\caching\Cache::set()|set()]]:将一个由键指定的数据项 存放到缓存中。
* [[yii\caching\Cache::add()|add()]]:如果缓存中未找到该键,则将指定数据存放到缓存中。
* [[yii\caching\Cache::add()|add()]]:如果缓存中未找到该键,则将指定数据存放到缓存中。
* [[yii\caching\Cache::mget()|mget()]]:通过指定的多个键从缓存中取回多项数据。
* [[yii\caching\Cache::getOrSet()|getOrSet()]]:返回由键指定的缓存项,或者执行回调函数,把函数的返回值用键来关联存储到缓存中,最后返回这个函数的返回值。
* [[yii\caching\Cache::mset()|mset()]]:将多项数据存储到缓存中,每项数据对应一个键 。
* [[yii\caching\Cache::multiGet()|multiGet()]]:由指定的键获取多个缓存数据项 。
* [[yii\caching\Cache::madd()|madd()]]:将多项数据存储到缓存中,每项数据对应一个键 。
* [[yii\caching\Cache::multiSet()|multiSet()]]:一次存储多个数据项到缓存中,每个数据都由一个键来指明 。
如果某个键已经存在于缓存中,则该项数据会被跳过 。
* [[yii\caching\Cache::multiAdd()|multiAdd()]]:一次存储多个数据项到缓存中,每个数据都由一个键来指明。如果某个键已经存在,则略过该数据项不缓存 。
* [[yii\caching\Cache::exists()|exists()]]:返回一个值,指明某个键是否存在于缓存中。
* [[yii\caching\Cache::exists()|exists()]]:返回一个值,指明某个键是否存在于缓存中。
* [[yii\caching\Cache::delete()|delete()]]:通过一个键,删除缓存中对应的值。
* [[yii\caching\Cache::delete()|delete()]]:通过一个键,删除缓存中对应的值。
* [[yii\caching\Cache::flush()|flush()]]:删除缓存中的所有数据。
* [[yii\caching\Cache::flush()|flush()]]:删除缓存中的所有数据。
> Note: Do not cache a `false` boolean value directly because the [[yii\caching\Cache::get()|get()]] method uses
> 注意: 千万别直接用`false`布尔值当做数据项缓存,因为[[yii\caching\Cache::get()|get()]]方法用
`false` return value to indicate the data item is not found in the cache. You may put `false` in an array and cache
`false` 作为返回值来表名对应的缓存项不存在。你可以把`false`放到一个数组里然后缓存这个数组来避免上述的混淆问题。
this array instead to avoid this problem.
有些缓存存储器如 MemCache,APC 支持以批量模式取回缓存值,这样可以节省取回
有些缓存存储器如 MemCache,APC 支持以批量模式取回缓存值,这样可以节省取回缓存数据的开支。
缓存数据的开支。[[yii\caching\Cache::mget()|mget()]] 和
[[yii\caching\Cache::multiGet()|multiGet()]]
[[yii\caching\Cache::madd()|ma dd()]] API提供对该特性的支持。
和 [[yii\caching\Cache::multiAdd()|multiA dd()]] API提供对该特性的支持。
如果底层缓存存储器不支持该特性,Yii 也会模拟实现。
如果底层缓存存储器不支持该特性,Yii 也会模拟实现。
由于 [[yii\caching\Cache]] 实现了 PHP `ArrayAccess` 接口,缓存组件也可以像数组那样使用,
由于 [[yii\caching\Cache]] 实现了 PHP `ArrayAccess` 接口,
下面是几个例子:
缓存组件也可以像数组那样使用, 下面是几个例子:
```php
```php
$cache['var1'] = $value1; // 等价于: $cache->set('var1', $value1);
$cache['var1'] = $value1; // 等价于: $cache->set('var1', $value1);
@ -146,12 +164,12 @@ $value2 = $cache['var2']; // 等价于: $value2 = $cache->get('var2');
### 缓存键 < span id = "cache-keys" > < / span >
### 缓存键 < span id = "cache-keys" > < / span >
存储在缓存中的每项数据都通过键作唯一识别。当你在缓存中存储一项
存储在缓存中的每项数据都通过键作唯一识别。
数据时,必须为它指定一个键,稍后从缓存中取回数据时,也需要提供
当你在缓存中存储一项 数据时,必须为它指定一个键,
相应的键。
稍后从缓存中取回数据时,也需要提供 相应的键。
你可以使用一个字符串或者任意值作为一个缓存键。当键不是一个字符串时,它将会自动
你可以使用一个字符串或者任意值作为一个缓存键。当键不是一个字符串时,
被序列化为一个字符串。
它将会自动 被序列化为一个字符串。
定义一个缓存键常见的一个策略就是在一个数组中包含所有的决定性因素。
定义一个缓存键常见的一个策略就是在一个数组中包含所有的决定性因素。
例如,[[yii\db\Schema]] 使用如下键存储一个数据表的结构信息。
例如,[[yii\db\Schema]] 使用如下键存储一个数据表的结构信息。
@ -167,9 +185,13 @@ $value2 = $cache['var2']; // 等价于: $value2 = $cache->get('var2');
如你所见,该键包含了可唯一指定一个数据库表所需的所有必要信息。
如你所见,该键包含了可唯一指定一个数据库表所需的所有必要信息。
当同一个缓存存储器被用于多个不同的应用时,应该为每个应用指定一个唯一的缓存键前缀
> 注意: 通过[[yii\caching\Cache::multiSet()|multiSet()]]或者[[yii\caching\Cache::multiAdd()|multiAdd()]]方法缓存的数据项的键,它的类型只能是字符串或整型,
以避免缓存键冲突。可以通过配置 [[yii\caching\Cache::keyPrefix]]
如果你想使用较为复杂的键,可以通过
属性实现。例如,在应用配置中可以编写如下代码:
[[yii\caching\Cache::set()|set()]]或者[[yii\caching\Cache::add()|add()]]方法来存储。
当同一个缓存存储器被用于多个不同的应用时,应该为每个应用指定一个唯一的缓存键前缀以避免缓存键冲突。
可以通过配置 [[yii\caching\Cache::keyPrefix]] 属性实现。
例如,在应用配置中可以编写如下代码:
```php
```php
'components' => [
'components' => [
@ -185,12 +207,12 @@ $value2 = $cache['var2']; // 等价于: $value2 = $cache->get('var2');
### 缓存过期 < span id = "cache-expiration" > < / span >
### 缓存过期 < span id = "cache-expiration" > < / span >
默认情况下,缓存中的数据会永久存留,除非它被某些缓存策略强制移除(例如:
默认情况下,缓存中的数据会永久存留,除非它被某些缓存策略强制移除(例如:缓存空间已满,最老的数据会被移除)。
缓存空间已满,最老的数据会被移除)。 要改变此特性,你可以在调用
要改变此特性,你可以在调用 [[yii\caching\Cache::set()|set()]] 存储一项数据时提供一个过期时间参数。
[[yii\caching\Cache::set()|set()]] 存储一项数据时提供一个过期时间参数 。
该参数代表这项数据在缓存中可保持有效多少秒 。
该参数代表这项数据在缓存中可保持有效多少秒。 当你调用
当你调用 [[yii\caching\Cache::get()|get()]] 取回数据时,
[[yii\caching\Cache::get()|get()]] 取回数据时, 如果它已经过了超时时间,
如果它已经过了超时时间,该方法将返回 false,表明在缓存中找不到这项数据。
该方法将返回 false,表明在缓存中找不到这项数据。 例如:
例如:
```php
```php
// 将数据在缓存中保留 45 秒
// 将数据在缓存中保留 45 秒
@ -204,6 +226,9 @@ if ($data === false) {
}
}
```
```
从2.0.11开始,如果想自定义缓存的持续时间,你可以在缓存组件配置中设置[[yii\caching\Cache::$defaultDuration|defaultDuration]]成员属性的值。
这样设置会覆盖默认的缓存持续时间,且在使用[[yii\caching\Cache::set()|set()]]方法时不必每次都传递$duration参数。
### 缓存依赖 < span id = "cache-dependencies" > < / span >
### 缓存依赖 < span id = "cache-dependencies" > < / span >
@ -213,8 +238,8 @@ if ($data === false) {
因此,缓存中任何过期的文件内容都应该被置为失效状态,
因此,缓存中任何过期的文件内容都应该被置为失效状态,
对 [[yii\caching\Cache::get()|get()]] 的调用都应该返回 false。
对 [[yii\caching\Cache::get()|get()]] 的调用都应该返回 false。
缓存依赖用 [[yii\caching\Dependency]] 的派生类所表示。当调用
缓存依赖用 [[yii\caching\Dependency]] 的派生类所表示。
[[yii\caching\Cache::set()|set()]] 在缓存中存储一项数据时,
当调用 [[yii\caching\Cache::set()|set()]] 在缓存中存储一项数据时,
可以同时传递一个关联的缓存依赖对象。例如:
可以同时传递一个关联的缓存依赖对象。例如:
```php
```php
@ -237,12 +262,10 @@ $data = $cache->get($key);
- [[yii\caching\DbDependency]]:如果指定 SQL 语句的查询结果发生了变化,则依赖改变。
- [[yii\caching\DbDependency]]:如果指定 SQL 语句的查询结果发生了变化,则依赖改变。
- [[yii\caching\ExpressionDependency]]:如果指定的 PHP 表达式执行结果发生变化,则依赖改变。
- [[yii\caching\ExpressionDependency]]:如果指定的 PHP 表达式执行结果发生变化,则依赖改变。
- [[yii\caching\FileDependency]]:如果文件的最后修改时间发生变化,则依赖改变。
- [[yii\caching\FileDependency]]:如果文件的最后修改时间发生变化,则依赖改变。
- [[yii\caching\GroupDependency]]:将一项缓存数据标记到一个组名,你可以通过调用
- [[yii\caching\TagDependency]]: associates a cached data item with one or multiple tags. You may invalidate
[[yii\caching\GroupDependency::invalidate()]] 一次性将相同组名的缓存全部置为失效状态。
the cached data items with the specified tag(s) by calling [[yii\caching\TagDependency::invalidate()]].
> Note: Avoid using [[yii\caching\Cache::exists()|exists()]] method along with dependencies. It does not check whether
> 注意:避免对带有缓存依赖的缓存项使用 [[yii\caching\Cache::exists()|exists()]] 方法,因为它不检测缓存依赖(如果有的话)是否有效,所以调用[[yii\caching\Cache::get()|get()]]可能返回`false`而调用[[yii\caching\Cache::exists()|exists()]]却返回`true`。
the dependency associated with the cached data, if there is any, has changed. So a call to
[[yii\caching\Cache::get()|get()]] may return `false` while [[yii\caching\Cache::exists()|exists()]] returns `true` .
## 查询缓存 < span id = "query-caching" > < / span >
## 查询缓存 < span id = "query-caching" > < / span >
@ -263,7 +286,7 @@ $result = $db->cache(function ($db) {
});
});
```
```
查询缓存可以用于 [ActiveRecord ](db-active-record.md ) 和 [DAO ](db-dao.md )。
查询缓存可以用在[DAO](db-dao.md)和[ActiveRecord](db-active-record.md)上:
```php
```php
$result = Customer::getDb()->cache(function ($db) {
$result = Customer::getDb()->cache(function ($db) {
@ -272,23 +295,21 @@ $result = Customer::getDb()->cache(function ($db) {
```
```
> Info: 有些 DBMS (例如:[MySQL](http://dev.mysql.com/doc/refman/5.1/en/query-cache.html))
> Info: 有些 DBMS (例如:[MySQL](http://dev.mysql.com/doc/refman/5.1/en/query-cache.html))
也支持数据库服务器端的查询缓存。你可以选择使用任一查询缓存机制 。
也支持数据库服务器端的查询缓存。
上文所述的查询缓存的好处在于你可以指定更灵活的缓存
你可以选择使用任一查询缓存机制。
依赖因此可能更加高效。
上文所述的查询缓存的好处在于你可以指定更灵活的缓存 依赖因此可能更加高效。
### Cache Flushing < span id = "cache-flushing" >
### 缓存冲刷 < span id = "cache-flushing" >
When you need to invalidate all the stored cache data, you can call [[yii\caching\Cache::flush()]].
当你想让所有的缓存数据失效时,可以调用[[yii\caching\Cache::flush()]]。
You can flush the cache from the console by calling `yii cache/flush` as well.
冲刷缓存数据,你还可以从控制台调用`yii cache/flush`。
- `yii cache` : lists the available caches in application
- `yii cache` : 列出应用中可用的缓存组件
- `yii cache/flush cache1 cache2` : flushes the cache components `cache1` , `cache2` (you can pass multiple component
- `yii cache/flush cache1 cache2` : 冲刷缓存组件`cache1`, `cache2` (可以传递多个用空格分开的缓存组件)
names separated with space)
- `yii cache/flush-all` : 冲刷应用中所有的缓存组件
- `yii cache/flush-all` : flushes all cache components in the application
> Info: Console application uses a separate configuration file by default. Ensure, that you have the same caching
> Info: 默认情况下,控制台应用使用独立的配置文件。所以,为了上述命令发挥作用,请确保Web应用和控制台应用配置相同的缓存组件。
components in your web and console application configs to reach the proper effect.
### 配置 < span id = "query-caching-configs" > < / span >
### 配置 < span id = "query-caching-configs" > < / span >
@ -329,8 +350,33 @@ If the result of a query is found valid in the cache, the query will be skipped
from the cache instead. If you do not specify the `$duration` parameter, the value of
from the cache instead. If you do not specify the `$duration` parameter, the value of
[[yii\db\Connection::queryCacheDuration|queryCacheDuration]] will be used instead.
[[yii\db\Connection::queryCacheDuration|queryCacheDuration]] will be used instead.
Sometimes within `cache()` , you may want to disable query caching for some particular queries. You can use
* [[yii\db\Connection::enableQueryCache|enableQueryCache]]:是否开启或关闭查询缓存,默认是`true`。注意,为了有效的开启查询缓存,你还需要配置一个由[[yii\db\Connection::queryCache|queryCache]]属性指定的缓存组件。
[[yii\db\Connection::noCache()]] in this case.
* [[yii\db\Connection::queryCacheDuration|queryCacheDuration]]: 这表示查询结果能够保持有效的秒数,设置为0的话,则会在缓存组件中永久缓存。这也是调用[[yii\db\Connection::cache()]]而没有指明缓存持续时间时的默认值。
* [[yii\db\Connection::queryCache|queryCache]]: 缓存应用组件的 ID。默认为 `'cache'` 。
只有在设置了一个有效的缓存应用组件时,查询缓存才会有效。
### 用法 < span id = "query-caching-usages" > < / span >
如果一次有多个SQL查询想利用查询缓存,你可以用[[yii\db\Connection::cache()]] 。用法如下,
```php
$duration = 60; // cache query results for 60 seconds.
$dependency = ...; // optional dependency
$result = $db->cache(function ($db) {
// ... perform SQL queries here ...
return $result;
}, $duration, $dependency);
```
在匿名函数里的任何一个SQL查询都会伴随指定的duration和dependency来生成缓存。
如果一个SQL查询的结果在缓存中有效,那么这个SQl语句将会被跳过而它的查询结果会直接从缓存中读取。如果你没有指明`$duration`参数,那么使用[[yii\db\Connection::queryCacheDuration|queryCacheDuration]]属性。
有时在`cache()`里,你可能不想缓存某些特殊的查询,这时你可以用[[yii\db\Connection::noCache()]]。
```php
```php
$result = $db->cache(function ($db) {
$result = $db->cache(function ($db) {
@ -349,15 +395,14 @@ $result = $db->cache(function ($db) {
});
});
```
```
If you just want to use query caching for a single query, you can call [[yii\db\Command::cache()]] when building
如果仅仅想缓存一个单独的查询,那么在建立查询命令时可以使用[[yii\db\Command::cache()]]。例如,
the command. For example,
```php
```php
// use query caching and set query cache duration to be 60 seconds
// use query caching and set query cache duration to be 60 seconds
$customer = $db->createCommand('SELECT * FROM customer WHERE id=1')->cache(60)->queryOne();
$customer = $db->createCommand('SELECT * FROM customer WHERE id=1')->cache(60)->queryOne();
```
```
You can also use [[yii\db\Command::noCache()]] to disable query caching for a single command. For example,
也可以用[[yii\db\Command::noCache()]]来单独设置某些查询命令不缓存。例如,
```php
```php
$result = $db->cache(function ($db) {
$result = $db->cache(function ($db) {
@ -376,11 +421,11 @@ $result = $db->cache(function ($db) {
### 限制条件 < span id = "query-caching-limitations" > < / span >
### 限制条件 < span id = "query-caching-limitations" > < / span >
当查询结果中含有资源句柄时,查询缓存无法使用。例如,
当查询结果中含有资源句柄时,查询缓存无法使用。
在有些 DBMS 中使用了 `BLOB` 列的时候,缓存结果会为
例如, 在有些 DBMS 中使用了 `BLOB` 列的时候,
该数据列返回一个资源句柄。
缓存结果会为 该数据列返回一个资源句柄。
有些缓存存储器有大小限制。例如,memcache 限制每条数据
有些缓存存储器有大小限制。例如,memcache 限制每条数据最大为 1MB。
最大为 1MB。 因此,如果查询结果的大小超出了该限制,
因此,如果查询结果的大小超出了该限制,
则会导致缓存失败。
则会导致缓存失败。