Zend Framework中有3种常用的前端类,分别是
Zend_Cache_Core
Zend_Cache_Frontend_Output
Zend_Cache_Frontend_Page
与之对应的ASP.NET中的概念分别是数据缓存,片段缓存,页面缓存。
其中Zend_Cache_Frontend_Output和Zend_Cache_Frontend_Page都继承了Zend_Cache_Core。
在创建缓存的时候,对应的代码如下,这些代码一般写在资源方法中,Bootstrap.php文件内。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
if
(false == Zend_Registry::isRegistered(
'coreCache'
)) {
$frontendOptions
=
array
(
'lifetime'
=> 10,
'automatic_serialization'
=> true
);
$backendOptions
=
array
(
'cache_dir'
=> APPLICATION_PATH .
'/tmp'
);
$core_cache
= Zend_Cache::factory(
'Core'
,
'File'
,
$frontendOptions
,
$backendOptions
);
Zend_Registry::set(
'coreCache'
,
$core_cache
);
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
if
(false == Zend_Registry::isRegistered(
'outputCache'
)) {
$frontendOptions
=
array
(
'lifetime'
=> 10
);
$backendOptions
=
array
(
'cache_dir'
=> APPLICATION_PATH .
'/tmp'
);
$output_cache
= Zend_Cache::factory(
'Output'
,
'File'
,
$frontendOptions
,
$backendOptions
);
Zend_Registry::set(
'outputCache'
,
$output_cache
);
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
if
(false == Zend_Registry::isRegistered(
'pageCache'
)) {
$frontendOptions
=
array
(
'lifetime'
=> 4
)
;
$backendOptions
=
array
(
'cache_dir'
=> APPLICATION_PATH .
'/tmp'
);
$page_cache
= Zend_Cache::factory(
'Page'
,
'File'
,
$frontendOptions
,
$backendOptions
);
Zend_Registry::set(
'pageCache'
,
$page_cache
);
}
|
Zend_Cache_Core主要用来缓存数据。比如数组,字符串之类的。类似ASP.NET中的数据缓存。下面的代码演示如何用缓存。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
try
{
$core_cache
= Zend_Registry::get(
'coreCache'
);
$z_now
= Zend_Date::now();
if
(!
$result
=
$core_cache
->load(
"now"
))
// 缓存未命中
{
echo
"缓存未命中<br>"
;
$core_cache
->save(
$z_now
,
"now"
);
//加入缓存
echo
$z_now
;
}
else
{
echo
"缓存命中<br>"
;
echo
$result
;
}
}
catch
(Exception
$e
) {
echo
$e
->getMessage();
}
|
初次打开页面,由于没有缓存,因此缓存未命中,把当前时间加入缓存中。然后刷新页面,缓存已经有了,直接读缓存,因此会发现时间不变。
当10秒后缓存失效,缓存又未命中了。
Zend_Cache_Frontend_Output继承了Zend_Cache_Core,因此上述的缓存数据的方法,它也可以使用。
同时它是一个输出捕捉前端.它在PHP中使用输出缓冲捕获start() 和 end() 方法间的一切输出. 类似于ASP.NET中的片段缓存。看如下示例代码:
1
2
3
4
5
6
7
8
9
10
11
12
|
try
{
$output_cache
= Zend_Registry::get(
'outputCache'
);
if
(!(
$output_cache
->start(
'myoutput'
))) {
echo
Zend_Date::now();
$output_cache
->
end
();
// output buffering ends
echo
"缓存未命中"
;
}
echo
"<br>当前时间为:"
;
echo
Zend_Date::now();
}
catch
(Exception
$e
) {
echo
$e
->getMessage();
}
|
$output_cache->start('myoutput') 这句话,如果已经有了myoutput这个缓存的话,也就是说start方法返回的是true的话,则if里面的语句运行了。直接把myoutput这个缓存的内容输出一遍。否则,重新记录一遍myoutput缓存,缓存的内容就是送start到end之间的内容。发送缓存记录后,后续的代码继续运行下去。
Zend_Cache_Frontend_Page同样继承了Zend_Cache_Core,它和Zend_Cache_Frontend_Output类似,但不同的是,它不是缓存单一的数据片断,而是缓存整个页面。因此它只有start方法,没有end方法,或者说当程序运行完,会自动的运行end方法。使用更简单,只需要代码如下:
1
2
3
4
5
6
7
|
try
{
$page_cache
= Zend_Registry::get(
'pageCache'
);
$page_cache
->start();
echo
Zend_Date::now();
}
catch
(Exception
$e
) {
echo
$e
->getMessage();
}
|
首次的时候,会把start方法后面的输出都会缓存起来。下次运行的时候,缓存命中的话,就直接发送缓存,而不执行下面的语句了。如果后续的语句是数据库中的数据,则会节省了数据库读取操作。提升了效率。
本文转自cnn23711151CTO博客,原文链接: http://blog.51cto.com/cnn237111/1300904,如需转载请自行联系原作者