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文件内。

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);
}


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);
}


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中的数据缓存。下面的代码演示如何用缓存。

try {$core_cache = Zend_Registry::get('coreCache');$z_now = Zend_Date::now();if (!$result = $core_cache->load("now")) // 缓存未命中{echo "缓存未命中
";$core_cache->save($z_now, "now");//加入缓存echo $z_now;} else {echo "缓存命中
";echo $result;}} catch (Exception $e) {
echo $e->getMessage();}

初次打开页面,由于没有缓存,因此缓存未命中,把当前时间加入缓存中。然后刷新页面,缓存已经有了,直接读缓存,因此会发现时间不变。

当10秒后缓存失效,缓存又未命中了。

Zend_Cache_Frontend_Output继承了Zend_Cache_Core,因此上述的缓存数据的方法,它也可以使用。

同时它是一个输出捕捉前端.它在PHP中使用输出缓冲捕获start() 和 end() 方法间的一切输出. 类似于ASP.NET中的片段缓存。看如下示例代码:

try {$output_cache = Zend_Registry::get('outputCache');if (!($output_cache->start('myoutput'))) {echo Zend_Date::now();$output_cache->end(); // output buffering endsecho "缓存未命中";}echo "
当前时间为:";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方法。使用更简单,只需要代码如下:

try {$page_cache = Zend_Registry::get('pageCache');$page_cache->start();echo Zend_Date::now();
} catch (Exception $e) {echo $e->getMessage();
}

首次的时候,会把start方法后面的输出都会缓存起来。下次运行的时候,缓存命中的话,就直接发送缓存,而不执行下面的语句了。如果后续的语句是数据库中的数据,则会节省了数据库读取操作。提升了效率。