在ci中有个页面缓存,控制器中使用$this->output->cache(n);即可缓存当前页面地址的整个html,针对不常变化的页面非常有用。得道网也有很多页面是不常变化的,可以对整个页面做缓存,实现原理同codeigniter。
首先是在钩子函数routershutdown中做拦截处理,获取当前uri,以当前uri做key,判断是否存在该key的缓存,若存在则停止解析,直接输出页面。
public function routershutdown(yaf_request_abstract $request, yaf_response_abstract $response){ $service_cache = new service_cache(); if($content = $service_cache->geturlcache($request->getrequesturi())) { echo $content;exit; }}
然后就是写缓存的动作,可以在特定的控制器或公用的模版渲染函数中处理。这里直接用了传参的方式接收参数,也可以类似ci output类中的cache函数处理。
public function render($template, $data = array(), $return = false, $is_cache = false){ $template = $this->_twig->loadtemplate ($this->gettemplatename($template)); $data = array_merge($this->_data, is_array($data) ? $data : array()); $content = $template->render ( $data ); if ($return === true) { return $content; } if($is_cache == true) { $service_cache = new service_cache(); $service_cache->seturlcache(yaf_dispatcher::getinstance()->getrequest()->getrequesturi(), $content); } echo $content;}
最后就是哪些页面需要使用缓存,可以默认设置$is_cache为true,也可以针对特定控制器处理,得道网对首页和bible页面做了处理,调用如下。
class biblecontroller extends yaf_controller_abstract { public function chapteraction() { //... $this->getview()->render('tpl/bible_chapter', array( 'bible' => $bible, ), false, true); }}
刷新验证,可以感受到一点点效果。
原文地址:yaf实现页面缓存, 感谢原作者分享。
