zend_framework之zend_cache

zend_framework之zend_cache

缓存有几个重要的概念:

1.数据本身

2.数据的标识

3.缓存生命期

4.缓存操作接口

缓存的获取操作一般十分快速, 而数据库操作一般是昂贵的, 所以通过缓存可以提高系统的整体性能.

Zend_Cache 的使用比较简单, 它可以把数据保存到 File, Memcache, SQLite 等介质(称为后端, Backend)中. 还有前端(Frontend), 主要用来对要缓存的数据进行转换, 如序列化.

==data==>Frontend==>mediate data==>Backend==>File, Memcache, etc

 

首先要清楚zend_cache是用于缓存数据的。缓存数据就是在程序第一次执行的时候,把需要缓存的地方进行缓存处理,保存到cache文件或内存中,当下次在运行这段代码的时候直接从缓存中取出保留的运行结果,而不在运行此程序。
要研究zend_cache就要从工厂实例出手,弄清每一个部分。cache的工厂实例是这样定义的:
$cache = Zend_Cache::factory($frontendName, $backendName,$frontendOptions,$backendOptions);

然后以此来阐述每一个参数的含义。
$frontendName是前端操作模块,前段操作模块共有六种:
1.Core 这是前端的核心缓存,前端的其他类型缓存都继承自Core,用于缓存变量或数组。
2.File 缓存文件,没有研究具体用途
3.Output 捕获并缓存输出,这个做页面局部缓存很有用,因为它只捕获start()到end()之间的代码,缺点是需要在视图中写入相应的代码。
4.Page 缓存页面,对提高效率帮助很大,因为一但命中缓存,就直接读取缓存并输出,不再执行后面的代码。可以设定session, cookie, get, post作为产生cache_id的干扰码。比如不同的cookie产生不同的缓存页面。缺点是只能整个页面缓存,不能像smarty那样实现整页缓存,但是可以控制局部不缓存。
5.Class 缓存静态类和对象。
6.Function 缓存函数。
$backendName是后端适配器,后端适配器共有7种:’File’, ‘Sqlite’, ‘Memcached’, ‘Apc’, ‘ZendPlatform’, ‘Xcache’, ‘TwoLevels’。其中File和Memcached最为常用。File是保存缓存结果到文件,Memcached是保存到内存,Sqlite是保存到Sqlite数据库,ZendPlatform是通过zend平台缓存等等。
$frontendOptions是前端参数:对于core和output可这样定义:
$frontendOptions = array(
‘caching’ => true, //开启缓存,调试程序的时候可以设为false
‘lifetime’ =>3600, //缓存生命期,就是缓存存在的时间
‘automatic_serialization’ =>true //自动序列化,存储数组或者对象数据时一定要打开
);
$backendOptions是后端参数,主要是用来指定保存缓存数据的路径:
$backendOptions = array(
‘cache_dir’ => ‘/tmp’, //存放路径
‘file_name_prefix’ =>’page_cache’ //缓存文件前缀,默认为zend_cache
)

一下列举一些实例:
实例一:
$frontendOptions = array(
‘lifetime’ => 3600, // 缓存寿命
‘debug_header’ => true, // true是打开debug,通常设为false
‘regexps’ => array(
‘^/$’ => array(‘cache’ => true), // 所有页面都缓存
‘^/guestbook/’ => array(‘cache’ => true), // 缓存guestbook下所有action页
‘^/guestbook/sign’ => array(‘cache’ => false), //对guestbook控制器的sign动作不缓存
),
‘default_options’ => array(
‘cache_with_get_variables’ => true,
‘cache_with_post_variables’ => true,
‘make_id_with_cookie_variables’ => true, // 注意如果开了session要把这个打开
‘cache_with_session_variables’ => true, // 注意如果开了session要把这个打开
‘cache_with_files_variables’ => true,
‘cache_with_cookie_variables’ => true, // 注意如果开了session要把这个打开
)
);
$backendOptions = array(
‘cache_dir’ => ‘C:/cache/’, // 缓存存放路径,必须存在并可写
);
$cache = Zend_Cache::factory(‘page’,
‘File’,
$frontendOptions,
$backendOptions);
$cache->start(); // 开始缓存

在这里需要注意的是:这段程序用于缓存整个页到文件,debug_header如果设为TRUE,这个选项使缓存页面输出一个消息头,来显示这是一个被缓存的页面。cache_with_get_variables选项表示缓存功能可以缓存包含get变量的页面,make_id_ with_get_variables选项表示所有页面输入都必须单独地缓存页面。也就是说,同一get变量的两个值会导致两个不同的缓存文件。另外通过设定regexps可以来指定哪个控制器的哪个Action将被缓存。当建立工厂实例后,通过调用start()进行缓存。

 

实例二:
$frontendOptions = array(
‘lifeTime’ => 7200, // 两小时的缓存生命期
‘automatic_serialization’ => true
);

$backendOptions = array(
‘cache_dir’ => ‘c:/dir/’ // 放缓存文件的目录
);
// 取得一个Zend_Cache_Core 对象
$cache = Zend_Cache::factory(‘Core’, ‘File’, $frontendOptions, $backendOptions);

if(!$result = $cache->load(‘myresult’)) {//查询是否存在id为myresult的缓存
// 缓存不命中;连接到数据库
$params = array (‘host’     => ‘localhost’,
‘username’ => ‘root’,
‘password’ => ‘root’,
‘dbname’   => ‘do’);
$db = Zend_Db::factory(‘MYSQLI’, $params);//定义适配器
$result = $db->fetchAll(‘SELECT * FROM xxx’);//查询数据库并取值
$cache->save($result, ‘myresult’); //把结果保存到id为myresult的缓存中
} else {
// cache hit! shout so that we know
echo “This one is from cache!\n\n”;//命中输出
}
print_r($result);

由于core前端模块适用于缓存变量和数组,因此对数据库数据的缓存依赖于core,同时我们要注意到id也就是程序中的myresult,它唯一标识一个缓存,myresult是自己人为定义的,它的名字可随便起,但不能重复。第一次load的时候肯定不命中,第二次就开始缓存了。

实例三:
$frontendOptions = array(
‘lifeTime’ => 30,                  // cache lifetime of 30 seconds
‘automatic_serialization’ => false // this is the default anyway s
);
// 翻译时实验系统为Windows,请使用Windows的读者修改cacheDir的路径为实际的路径
$backendOptions = array(‘cache_dir’ => ‘c:/cache/’);
$cache = Zend_Cache::factory(‘Output’,
‘File’,
$frontendOptions,
$backendOptions);
// 传递一个唯一标识符给start()方法
if(!$cache->start(‘ss’)) {
// output as usual:
echo ‘Hello world! ‘;
echo ‘This is cached (‘.time().’) ‘;
$cache->end(); // the output is saved and sent to the browser
}else{
echo “wo yi jing bei huan cun!”;
}
echo ‘This is never cached (‘.time().’).’;

此实例再次证明了output缓存的只是start和end之间的数据,另外还要注意start中的参数ss即为cache的id。

也许给了例子,还是不明白怎么在zend里面用,这三个例子如果写在controller文件中时,可以把它们写在init方法的下面,这样当初始化时及执行此程序,在controller中init首先执行,当然也可以写到Action中,直接调用就可以。我自己认为像page,写在init中还是比较好的。

实例四:

 

<?php
// “load” Zend_Cache 工厂
require ‘Zend/Cache.php’;

// 选择一个前端(例如’Core’, ‘Output’, ‘Page’…)
$frontendName = ‘Core’;

// 选择一个后端(例如’File’或者’Sqlite’…)
$backendName = ‘File’;

// 为选择的前端设置一个选项数组
// 前端把要缓存的数据序列化, 这样就可以缓存数组, 对象的实例等数据.
$frontendOptions = array(‘automatic_serialization’=>true);

// 为选择的后端设置一个选项数组
// 缓存文件被保存在 ./cache 目录下.
$backendOptions = array(‘cache_dir’ => ‘./cache’);

// 创建实例(当然,最后两个参数是可选的)
$cache = Zend_Cache::factory($frontendName, $backendName, $frontendOptions, $backendOptions);

// 数据的标识
$id = ‘mydata’;
$data = $cache->load($id);
if(!$data){
// 缓存中没有需要的数据(缓存未命中), 所以需要从数据库或者其它地方把数据放入缓存.
// 这里的代码是耗时和耗资源的.
$data = query_database();
$tags = array();
// 缓存的生命期为 10 秒.
$lifetime = 10;
$cache->save($data, $id, $tags, $lifetime);
}

// 对数据进行处理.
manipulate(data);
?>

发表评论

电子邮件地址不会被公开。 必填项已用*标注