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