Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yii2
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PSDI Army
yii2
Commits
33c36f2a
Commit
33c36f2a
authored
Jul 03, 2013
by
resurtm
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Docs: caching WIP.
parent
96184c2c
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
190 additions
and
0 deletions
+190
-0
caching.md
docs/guide/caching.md
+190
-0
No files found.
docs/guide/caching.md
View file @
33c36f2a
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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment