resurtm
12 years ago
1 changed files with 190 additions and 0 deletions
@ -1,3 +1,193 @@ |
|||||||
Caching |
Caching |
||||||
======= |
======= |
||||||
|
|
||||||
|
Overview and Base Concepts |
||||||
|
-------------------------- |
||||||
|
|
||||||
|
Caching is a cheap and effective way to improve the performance of a web application. By storing relatively |
||||||
|
static data in cache and serving it from cache when requested, we save the time needed to generate the data. |
||||||
|
|
||||||
|
Using cache in Yii mainly involves configuring and accessing a cache application component. The following |
||||||
|
application configuration specifies a cache component that uses [memcached](http://memcached.org/) with |
||||||
|
two cache servers. |
||||||
|
|
||||||
|
```php |
||||||
|
'components' => array( |
||||||
|
'cache' => array( |
||||||
|
'class' => '\yii\caching\MemCache', |
||||||
|
'servers' => array( |
||||||
|
array( |
||||||
|
'host' => 'server1', |
||||||
|
'port' => 11211, |
||||||
|
'weight' => 100, |
||||||
|
), |
||||||
|
array( |
||||||
|
'host' => 'server2', |
||||||
|
'port' => 11211, |
||||||
|
'weight' => 50, |
||||||
|
), |
||||||
|
), |
||||||
|
), |
||||||
|
), |
||||||
|
``` |
||||||
|
|
||||||
|
When the application is running, the cache component can be accessed through `Yii::$app->cache` call. |
||||||
|
|
||||||
|
Yii provides various cache components that can store cached data in different media. For example, |
||||||
|
the [[\yii\caching\MemCache]] component encapsulates the PHP [memcache](http://php.net/manual/en/book.memcache.php) |
||||||
|
and [memcached](http://php.net/manual/en/book.memcached.php) extensions and uses memory as the medium |
||||||
|
of cache storage; the [[\yii\caching\ApcCache]] component encapsulates the PHP |
||||||
|
[APC](http://php.net/manual/en/book.apc.php) extension; and the [[\yii\caching\DbCache]] component stores |
||||||
|
cached data in database table. |
||||||
|
|
||||||
|
The following is a summary of the available cache components: |
||||||
|
|
||||||
|
* [[\yii\caching\ApcCache]]: uses PHP [APC](http://php.net/manual/en/book.apc.php) extension. This option can be |
||||||
|
considered as the fastest one when dealing with cache for a centralized thick application (e.g. one |
||||||
|
server, no dedicated load balancers, etc.). |
||||||
|
|
||||||
|
* [[\yii\caching\DbCache]]: uses a database table to store cached data. By default, it will create and use a |
||||||
|
[SQLite3](http://sqlite.org/) database under the runtime directory. You can explicitly specify a database for |
||||||
|
it to use by setting its `db` property. |
||||||
|
|
||||||
|
* [[\yii\caching\DummyCache]]: presents dummy cache that does no caching at all. The purpose of this component |
||||||
|
is to simplify the code that needs to check the availability of cache. For example, during development or if |
||||||
|
the server doesn't have actual cache support, we can use this cache component. When an actual cache support |
||||||
|
is enabled, we can switch to use the corresponding cache component. In both cases, we can use the same |
||||||
|
code `Yii::$app->cache->get($key)` to attempt retrieving a piece of data without worrying that |
||||||
|
`Yii::$all->cache` might be `null`. |
||||||
|
|
||||||
|
* [[\yii\caching\FileCache]]: uses standard files to store cached data. This is particular suitable |
||||||
|
to cache large chunk of data (such as pages). |
||||||
|
|
||||||
|
* [[\yii\caching\MemCache]]: uses PHP [memcache](http://php.net/manual/en/book.memcache.php) |
||||||
|
and [memcached](http://php.net/manual/en/book.memcached.php) extensions. This option can be considered as |
||||||
|
the fastest one when dealing with cache in a distributed applications (e.g. with several servers, load |
||||||
|
balancers, etc.) |
||||||
|
|
||||||
|
* [[\yii\caching\RedisCache]]: implements a cache component based on [Redis](http://redis.io/) NoSQL database. |
||||||
|
|
||||||
|
* [[\yii\caching\WinCache]]: uses PHP [WinCache](http://iis.net/downloads/microsoft/wincache-extension) |
||||||
|
([see also](http://php.net/manual/en/book.wincache.php)) extension. |
||||||
|
|
||||||
|
* [[\yii\caching\XCache]]: uses PHP [XCache](http://xcache.lighttpd.net/) extension. |
||||||
|
|
||||||
|
* [[\yii\caching\ZendDataCache]]: uses |
||||||
|
[Zend Data Cache](http://files.zend.com/help/Zend-Server-6/zend-server.htm#data_cache_component.htm) |
||||||
|
as the underlying caching medium. |
||||||
|
|
||||||
|
Tip: because all these cache components extend from the same base class [[Cache]], one can switch to use |
||||||
|
a different type of cache without modifying the code that uses cache. |
||||||
|
|
||||||
|
Caching can be used at different levels. At the lowest level, we use cache to store a single piece of data, |
||||||
|
such as a variable, and we call this data caching. At the next level, we store in cache a page fragment which |
||||||
|
is generated by a portion of a view script. And at the highest level, we store a whole page in cache and serve |
||||||
|
it from cache as needed. |
||||||
|
|
||||||
|
In the next few subsections, we elaborate how to use cache at these levels. |
||||||
|
|
||||||
|
Note, by definition, cache is a volatile storage medium. It does not ensure the existence of the cached |
||||||
|
data even if it does not expire. Therefore, do not use cache as a persistent storage (e.g. do not use cache |
||||||
|
to store session data or other valuable information). |
||||||
|
|
||||||
|
Data Caching |
||||||
|
------------ |
||||||
|
|
||||||
|
Data caching is about storing some PHP variable in cache and retrieving it later from cache. For this purpose, |
||||||
|
the cache component base class [[\yii\caching\Cache]] provides two methods that are used most of the time: |
||||||
|
[[set()]] and [[get()]]. Note, only serializable variables and objects could be cached successfully. |
||||||
|
|
||||||
|
To store a variable `$value` in cache, we choose a unique `$key` and call [[set()]] to store it: |
||||||
|
|
||||||
|
```php |
||||||
|
Yii::$app->cache->set($key, $value); |
||||||
|
``` |
||||||
|
|
||||||
|
The cached data will remain in the cache forever unless it is removed because of some caching policy |
||||||
|
(e.g. caching space is full and the oldest data are removed). To change this behavior, we can also supply |
||||||
|
an expiration parameter when calling [[set()]] so that the data will be removed from the cache after |
||||||
|
a certain period of time: |
||||||
|
|
||||||
|
```php |
||||||
|
// keep the value in cache for at most 45 seconds |
||||||
|
Yii::$app->cache->set($key, $value, 45); |
||||||
|
``` |
||||||
|
|
||||||
|
Later when we need to access this variable (in either the same or a different web request), we call [[get()]] |
||||||
|
with the key to retrieve it from cache. If the value returned is `false`, it means the value is not available |
||||||
|
in cache and we should regenerate it: |
||||||
|
|
||||||
|
```php |
||||||
|
public function getCachedData() |
||||||
|
{ |
||||||
|
$key = /* generate unique key here */; |
||||||
|
$value = Yii::$app->getCache()->get($key); |
||||||
|
if ($value === false) { |
||||||
|
$value = /* regenerate value because it is not found in cache and then save it in cache for later use */; |
||||||
|
Yii::$app->cache->set($id, $value); |
||||||
|
} |
||||||
|
return $value; |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
This is the common pattern of arbitrary data caching for general use. |
||||||
|
|
||||||
|
When choosing the key for a variable to be cached, make sure the key is unique among all other variables that |
||||||
|
may be cached in the application. It is **NOT** required that the key is unique across applications because |
||||||
|
the cache component is intelligent enough to differentiate keys for different applications. |
||||||
|
|
||||||
|
Some cache storages, such as MemCache, APC, support retrieving multiple cached values in a batch mode, |
||||||
|
which may reduce the overhead involved in retrieving cached data. A method named [[mget()]] is provided |
||||||
|
to exploit this feature. In case the underlying cache storage does not support this feature, |
||||||
|
[[mget()]] will still simulate it. |
||||||
|
|
||||||
|
To remove a cached value from cache, call [[delete()]]; and to remove everything from cache, call [[flush()]]. |
||||||
|
Be very careful when calling [[flush()]] because it also removes cached data that are from other applications. |
||||||
|
|
||||||
|
Note, because CCache implements ArrayAccess, a cache component can be used liked an array. The followings |
||||||
|
are some examples: |
||||||
|
|
||||||
|
```php |
||||||
|
$cache = Yii::$app->getComponent('cache'); |
||||||
|
$cache['var1'] = $value1; // equivalent to: $cache->set('var1', $value1); |
||||||
|
$value2 = $cache['var2']; // equivalent to: $value2 = $cache->get('var2'); |
||||||
|
``` |
||||||
|
|
||||||
|
### Cache Dependency |
||||||
|
|
||||||
|
TBD: http://www.yiiframework.com/doc/guide/1.1/en/caching.data#cache-dependency |
||||||
|
|
||||||
|
### Query Caching |
||||||
|
|
||||||
|
TBD: http://www.yiiframework.com/doc/guide/1.1/en/caching.data#query-caching |
||||||
|
|
||||||
|
Fragment Caching |
||||||
|
---------------- |
||||||
|
|
||||||
|
TBD: http://www.yiiframework.com/doc/guide/1.1/en/caching.fragment |
||||||
|
|
||||||
|
### Caching Options |
||||||
|
|
||||||
|
TBD: http://www.yiiframework.com/doc/guide/1.1/en/caching.fragment#caching-options |
||||||
|
|
||||||
|
### Nested Caching |
||||||
|
|
||||||
|
TBD: http://www.yiiframework.com/doc/guide/1.1/en/caching.fragment#nested-caching |
||||||
|
|
||||||
|
Dynamic Content |
||||||
|
--------------- |
||||||
|
|
||||||
|
TBD: http://www.yiiframework.com/doc/guide/1.1/en/caching.dynamic |
||||||
|
|
||||||
|
Page Caching |
||||||
|
------------ |
||||||
|
|
||||||
|
TBD: http://www.yiiframework.com/doc/guide/1.1/en/caching.page |
||||||
|
|
||||||
|
### Output Caching |
||||||
|
|
||||||
|
TBD: http://www.yiiframework.com/doc/guide/1.1/en/caching.page#output-caching |
||||||
|
|
||||||
|
### HTTP Caching |
||||||
|
|
||||||
|
TBD: http://www.yiiframework.com/doc/guide/1.1/en/caching.page#http-caching |
||||||
|
Loading…
Reference in new issue