Zend_Cache前端Zend_Cache_Core简介
可用选项这些选项被传递给如前面例子中演示的工厂方法.
例子An example is given in the manual at the very beginning. 如果你只向缓存中存储字符串(由于"automatic_serialization"选项,可能会存储一些布尔值),你可以使用更加简介的构造:
// 假定你已经有 $cache
$id = 'myBigLoop'; // cache id of "what we want to cache"
if (!($data = $cache->load($id))) {
// cache miss
$data = '';
for ($i = 0; $i < 10000; $i++) {
$data = $data . $i;
}
$cache->save($data);
}
// [...] do something with $data (echo it, pass it on etc.)
如果你缓存多个块或则数据实例,意思是一样的:
// 确保使用独一无二的 identifiers:
$id1 = 'foo';
$id2 = 'bar';
// block 1
if (!($data = $cache->load($id1))) {
// cache missed
$data = '';
for ($i=0;$i<10000;$i++) {
$data = $data . $i;
}
$cache->save($data);
}
echo($data);
// this isn't affected by caching
echo('NEVER CACHED! ');
// block 2
if (!($data = $cache->load($id2))) {
// cache missed
$data = '';
for ($i=0;$i<10000;$i++) {
$data = $data . '!';
}
$cache->save($data);
}
echo($data);
如果你想缓存特殊值(带 "automatic_serialization" 选项的布尔值)或不能用上述紧缩结构的空字符串,你需要正式地测试缓存记录。
// the compact construction
// (not good if you cache empty strings and/or booleans)
if (!($data = $cache->load($id))) {
// cache missed
// [...] we make $data
$cache->save($data);
}
// we do something with $data
// [...]
// the complete construction (works in any case)
if (!($cache->test($id))) {
// cache missed
// [...] we make $data
$cache->save($data);
} else {
// cache hit
$data = $cache->load($id);
}
// we do something with $data
Zend_Cache_Frontend_Output简介
可用的选项
该前端除了 例子An example is given in the manual at the very beginning. Here it is with minor changes:
// if it is a cache miss, output buffering is triggered
if (!($cache->start('mypage'))) {
// output everything as usual
echo 'Hello world! ';
echo 'This is cached ('.time().') ';
$cache->end(); // output buffering ends
}
echo 'This is never cached ('.time().').';
Using this form it is fairly easy to set up output caching in your already working project with little or no code refactoring. Zend_Cache_Frontend_FunctionIntroduction
A可用的选项
例子
在PHP中使用
$cache->call('veryExpensiveFunc', $params);
// $params is an array
// For example to call veryExpensiveFunc(1, 'foo', 'bar') with
// caching, you can use
// $cache->call('veryExpensiveFunc', array(1, 'foo', 'bar'))
Zend_Cache_Frontend_ClassIntroduction
Available options
ExamplesFor example, to cache static calls :
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' // The name of the class
);
// [...]
// The cached call
$result = $cache->foobar('1', '2');
To cache classic method calls :
class Test {
private $_string = 'hello !';
public function foobar2($param1, $param2) {
echo($this->_string);
echo "foobar2_output($param1, $param2)";
return "foobar2_return($param1, $param2)";
}
}
// [...]
$frontendOptions = array(
'cached_entity' => new Test() // An instance of the class
);
// [...]
// The cached call
$result = $cache->foobar2('1', '2');
Zend_Cache_Frontend_FileIntroduction
For instance, you have an XML configuration file which is parsed by a function
which returns a "config object" (like with Available options
Examples
Use of this frontend is the same than of Zend_Cache_Frontend_PageIntroduction
On the other hand, the "cache id" is calculated automatically with
For the moment, it's not implemented but we plan to add a HTTP conditional system to save bandwidth (the system will send a HTTP 304 Not Modified if the cache is hit and if the browser has already the good version). Available options (for this frontend in Zend_Cache factory)
ExamplesUse of Zend_Cache_Frontend_Page is really trivial :
// [...] // require, configuration and factory
$cache->start();
// if the cache is hit, the result is sent to the browser and the script stop here
// rest of the page ...
a more complex example which shows a way to get a centralized cache management in a bootstrap file (for using with Zend_Controller for example)
/*
* 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
特殊的取消方法因为设计问题,在有些情况下(例如使用非 HTTP/200 返回代码时),你可能需要取消当前缓存处理,所以 我们引入这个特别的前端,cancel()方法。
// [...] // require, configuration and factory
$cache->start();
// [...]
if ($someTest) {
$cache->cancel();
// [...]
}
// [...]
|