Zend_Cache
在Zend Framework中缓存由前端(Core,Output, File, Function 和 Class)操作,同时通过后端适配器(File, Sqlite, Memcache…)和 一个灵活的IDs和Tags系统(标识符和标记系统)存储缓存纪录。
Zend_Cache前端
主要调用 Zend_Cache::factory()
取得前端,如果你想缓存特殊值(带 “automatic_serialization” 选项的布尔值)或不能用上述紧缩结构的空字符串,你需要正式地测试缓存记录。
1.Zend_Cache_Core
参数:1.caching(测试用)
;2.lifetime(缓存时间)
;3.cache_id_prefix(前缀ID)
;4.automatic_serialization(序列化)
$frontendOptions = array(
'lifeTime' => 7200, // 两小时的缓存生命期
'automatic_serialization' => true
);
$backendOptions = array(
'cache_dir' => './tmp/' // 放缓存文件的目录
);
// 取得一个Zend_Cache_Core 对象
$cache = Zend_Cache::factory('Core','File', $frontendOptions, $backendOptions);
2.Zend_Cache_Frontend_Output
Zend_Cache_Frontend_Output 是一个输出捕捉前端.它在PHP中使用输出缓冲捕获start() 和 end() 方法间的一切输出.
$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' => './tmp/');
$cache = Zend_Cache::factory('Output',
'File',
$frontendOptions,
$backendOptions);
// 传递一个唯一标识符给start()方法
if(!$cache->start('mypage')) {
// output as usual:
echo 'Hello world! ';
echo 'This is cached ('.time().') ';
$cache->end(); // the output is saved and sent to the browser
}
Zend_Cache后端
Zend_Cache_Backend_File
参数:cache_dir
数据缓存
// 查看一个缓存是否存在:
// 紧凑结构(如果缓存空字符串和/或布尔值,则不适用)
if(!$result = $cache->load('myresult')) {
// 缓存不命中;连接到数据库
$db = Zend_Db::factory( [...] );
$result = $db->fetchAll('SELECT * FROM huge_table');
$cache->save($result, 'myresult');
} else {
// cache hit! shout so that we know
echo "This one is from cache!\n\n";
}
// 完整的结构(无论如何都适用)
if (!($cache->test($id))) {
// 缓存不命中
// 重新取出 $data
$cache->save($data);
} else {
// 缓存命中
$data = $cache->load($id);
}
print_r($result);
缓存取消
因为设计问题,在有些情况下(例如使用非 HTTP/200 返回代码时),你可能需要取消当前缓存处理,所以 我们引入这个特别的前端,cancel()方法。
// [...] // require, configuration and factory
$cache->start();
// [...]
if ($someTest) {
$cache->cancel();
// [...]
}
// [...]
标记纪录
save()方法接受可选的第四个参数:$ specificLifetime = false,它为此特定缓存记录设置特定的生命周期)
$cache->save($huge_data, 'myUniqueID', array('tagA', 'tagB', 'tagC'));
缓存清理
//清除一个记录
$cache->remove('idToRemove')
// 清除所有缓存纪录
$cache->clean(Zend_Cache::CLEANING_MODE_ALL);
// 仅清除过期的
$cache->clean(Zend_Cache::CLEANING_MODE_OLD);
//如果你想删除标记为'tagA'和'tagC'的缓存项
$cache->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array('tagA', 'tagC'));
//如果你想删除标记不为'tagA'和'tagC'的缓存项
$cache->clean(Zend_Cache::CLEANING_MODE_NOT_MATCHING_TAG, array('tagA', 'tagC'));
其他Zend_Cache前端
1.Zend_Cache_Frontend_Function
Zend_Cache_Frontend_Function缓存函数调用的结果。 它有一个名为call()的main方法,它接受一个函数名和数组中调用的参数。
$cache->call('veryExpensiveFunc', array(1, 'foo', 'bar'))
2.Zend_Cache_Frontend_Class
Zend_Cache_Frontend_Class与Zend_Cache_Frontend_Function不同,因为它允许缓存对象和静态方法调用。
参数:cached_entity (required)
如果设置为类名,我们将缓存一个抽象类,并将只使用静态调用;如果设置为对象,我们将缓存此对象方法
class test {
// Static method
public static function foobar($param1, $param2) {
echo "foobar_output($param1, $param2)";
return "foobar_return($param1, $param2)";
}
}
// [...]
$frontendOptions = array(
'cached_entity' => 'Test' //1. The name of the class
'cached_entity' => new Test() //2. An instance of the class
);
// [...]
// The cached call
$result = $cache->foobar('1', '2');
3.Zend_Cache_Frontend_File
Zend_Cache_Frontend_File是由“主文件”的修改时间驱动的前端。
例如,您有一个XML配置文件,该文件由一个返回“配置对象”的函数解析(与Zend_Config一样)。使用Zend_Cache_Frontend_File,您可以将“配置对象”存储到缓存中(以避免每次解析XML配置文件),但是对“主文件”有一种强烈的依赖性。因此,如果修改了XML配置文件,则会立即使缓存失效。
4.Zend_Cache_Frontend_Page
Zend_Cache_Frontend_Page与Zend_Cache_Frontend_Output类似,但设计用于完整页面。使用Zend_Cache_Frontend_Page仅缓存单个块是不可能的。
另一方面,使用 SERVER[′REQUESTURI′]和(取决于选项) S E R V E R [ ′ R E Q U E S T U R I ′ ] 和 ( 取 决 于 选 项 ) _GET等自动计算“缓存ID”。此外,您只能调用start(),因为当页面结束时,end()调用是完全自动的。
/*
* you should avoid putting too many lines before the cache section.
* For example, for optimal performances, "require_once" or
* "Zend_Loader::loadClass" should be after the cache section.
*/
$frontendOptions = array(
'lifetime' => 7200,
'debug_header' => true, // for debugging
'regexps' => array(
// cache the whole IndexController
'^/$' => array('cache' => true),
// cache the whole IndexController
'^/index/' => array('cache' => true),
// we don't cache the ArticleController...
'^/article/' => array('cache' => false),
// ... but we cache the "view" action of this ArticleController
'^/article/view/' => array(
'cache' => true,
// and we cache even there are some variables in $_POST
'cache_with_post_variables' => true,
// but the cache will be dependent on the $_POST array
'make_id_with_post_variables' => true
)
)
);
$backendOptions = array(
'cache_dir' => '/tmp/'
);
// getting a Zend_Cache_Frontend_Page object
$cache = Zend_Cache::factory('Page',
'File',
$frontendOptions,
$backendOptions);
$cache->start();
// if the cache is hit, the result is sent to the browser and the
// script stop here
// [...] the end of the bootstrap file
// these lines won't be executed if the cache is hit
Zend_Config
这个模块主要用于环境配置的加载与引用
方法:
1.get()
如果数据元素不存在,它将返回提供的缺省值,例如:
$host = $config->database->get('host', 'localhost')
2.merge()
如果你有两个Zend_Config对象,你可以用merge()函数把它们合并成一个单个的对象。
例如,对config和localConfig,使用$config->merge($localConfig)
,你可以把数据从localConfig合并到config。在localConfig中的条目将覆盖在config中同名的条目。
Zend_Config对象还可以使用count()函数
和PHP语句如foreach
。
继承特性
Zend_Config函数家族把配置数据组织成节(section)。Zend_Config适配器对象可以带一个指定的节加载,或者带有多个指定的节,或者所有节(如果没有指定(null))。
Zend_Config适配器类支持单继承模型,一个继承的节可以重写从父节继承过来的值。象PHP类继承,一个节可以从一个父节继承,这个父节可能是从祖父节继承的,等等,但是多重继承(例如,节C直接从父节A和B继承)不被支持。
如果数据只有一节时,直接把配置数据写入php文件,绕过Config直接使用数据可能会更好;
但是如果有多组数据,因为数据继承的关系,该模块的优势大大增加,此时有4种方法:
1.直接把写好的数组放入构造器变量中
// 给出一个配置数据的数组
$configArray = array(
'webhost' => 'www.example.com',
'database' => array(
'adapter' => 'pdo_mysql',
'params' => array(
'host' => 'db.example.com',
'username' => 'dbuser',
'password' => 'secret',
'dbname' => 'mydatabase'
)
)
);
// 基于配置数据创建面向对象的 wrapper
$config = new Zend_Config($configArray);
// 输出配置数据 (结果在'www.example.com'中)
echo $config->webhost;
// 使用配置数据来连接数据库
$db = Zend_Db::factory($config->database->adapter,
$config->database->params->toArray());
// 另外的用法:简单地传递 Zend_Config 对象。
// Zend_Db factory 知道如何翻译它。
$db = Zend_Db::factory($config->database);
2.引入php文件
$config = new Zend_Config(require 'config.php');
// config.php
return array(
'webhost' => 'www.example.com',
'database' => array(
'adapter' => 'pdo_mysql',
'params' => array(
'host' => 'db.example.com',
'username' => 'dbuser',
'password' => 'secret',
'dbname' => 'mydatabase'
)
)
);
3.引入ini文件
默认的键分离器字符是句号(.)。然而,这个可以通过$options['nestSeparator']
被修改。例如:
$options['nestSeparator'] = ':';
$config = new Zend_Config_Ini('/path/to/config.ini', 'staging', $options);
config.ini文件
; 生产站点配置数据
[production]
webhost = www.example.com
database.adapter = pdo_mysql
database.params.host = db.example.com
database.params.username = dbuser
database.params.password = secret
database.params.dbname = dbname
; 开发站点配置数据从生产站点配置数据集成并如果需要可以重写
[staging : production]
database.params.host = dev.example.com
database.params.username = devuser
database.params.password = devsecret
调用
$config = new Zend_Config_Ini('/path/to/config.ini', 'staging');
echo $config->database->params->host; // 输出 "dev.example.com"
echo $config->database->params->dbname; // 输出 "dbname"
4.引入xml文件
config.xml文件 1
<?xml version="1.0"?>
<configdata>
<production>
<webhost>www.example.com</webhost>
<database>
<adapter>pdo_mysql</adapter>
<params>
<host>db.example.com</host>
<username>dbuser</username>
<password>secret</password>
<dbname>dbname</dbname>
</params>
</database>
</production>
<staging extends="production">
<database>
<params>
<host>dev.example.com</host>
<username>devuser</username>
<password>devsecret</password>
</params>
</database>
</staging>
</configdata>
config.xml文件 2
<?xml version="1.0"?>
<configdata>
<production webhost="www.example.com">
<database adapter="pdo_mysql">
<params host="db.example.com" username="dbuser" password="secret" dbname="dbname"/>
</database>
</production>
<staging extends="production">
<database>
<params host="dev.example.com" username="devuser" password="devsecret"/>
</database>
</staging>
</configdata>
config.xml文件 3
<?xml version="1.0"?>
<configdata>
<production>
<webhost>www.example.com</webhost>
<database>
<adapter value="pdo_mysql"/>
<params>
<host value="db.example.com"/>
<username value="dbuser"/>
<password value="secret"/>
<dbname value="dbname"/>
</params>
</database>
</production>
<staging extends="production">
<database>
<params>
<host value="dev.example.com"/>
<username value="devuser"/>
<password value="devsecret"/>
</params>
</database>
</staging>
</configdata>
调用
$config = new Zend_Config_Xml('/path/to/config.xml', 'staging');
echo $config->database->params->host; // 输出 "dev.example.com"
echo $config->database->params->dbname; // 输出 "dbname"