干货分享,灵感创作,不定期更新,敬请期待。

thinkphp实现html静态缓存

php xhq 5961℃ 0评论

由于公司项目需求,要把部分页面做成静态html,又因为thinkphp3.2手册没提到(3.1有),于是自己写了个简单的,当然,这里也介绍thinkphp内置方法。
找到文件/ThinkPHP/Library/Think/Controller.class.php
添加一个属性

/**
*html静态文件路径
*/
protected $filename = null;

然后添加两个方法

    //关于路径,会在项目目录下生成一个static文件夹,然后对应的模块,控制器和操作
    protected function html_before(){
        $suffix = C('HTML_FILE_SUFFIX')?C('HTML_FILE_SUFFIX'):'shtml';
            $filename = APP_PATH.'/static/'.__ACTION__.'.'.$suffix;
        if(Storage::has($filename)){
            if(time() - Storage::get($filename,'mtime') < $expire){ exit(Storage::read($filename)); } } $this->filename = $filename;
    }
    /**
     *html静态文件缓存
     * @access protected
     * @param string $templateFile 指定要调用的模板文件
     * 默认为空 由系统自动定位模板文件
     * @param string $charset 输出编码
     * @param string $contentType 输出类型
     * @param string $content 输出内容
     * @param string $prefix 模板缓存前缀
     * @return void
    */
    protected function html_after($templateFile='',$charset='',$contentType='',$content='',$prefix=''){
        if($this->filename !== null){
            $this->view->display($templateFile,$charset,$contentType,$content,$prefix);
            Storage::put($this->filename, ob_get_contents());
        }
    }

用法:
如在Home模块的HtmlController.class.php下

 
 <?php
    namespace Home\Controller;
    use Think\Controller;

    class HtmlController extends Controller{
    	public function index(){
    		$this->html_before();
    		//以下是一堆逻辑
    		$m_user = D('user');
    		$m_user->select();
    		......
    		$this->html_after();
    	}
    }

 ?>

后面再加上自定义的路径和时间,于是把html_before改为

    /**
     *html静态文件缓存
     * @access protected
     * @param string $filename 生成的静态文件名称
     * @param string $filepath 生成的静态文件路径
     * @param string $expire 静态文件缓存时间
     * @return void
    */
    protected function html_before($filename = '',$filepath = '',$expire = 7200){
        $suffix = C('HTML_FILE_SUFFIX')?C('HTML_FILE_SUFFIX'):'shtml';
        if($filename === '' && $filepath === ''){
            $filename = APP_PATH.'/static/'.__ACTION__.'.'.$suffix;
        }else{
            $filename = $filename?$filename.'.'.$suffix:md5(__ACTION__).'.'.$suffix;
            $filepath = $filepath?APP_PATH.'/'.$filepath:APP_PATH.'/static';
            $filename = $filepath.'/'.$filename;
        }
        if(Storage::has($filename)){
            if(time() - Storage::get($filename,'mtime') < $expire){ exit(Storage::read($filename)); } } $this->filename = $filename;
    }

 <?php
    namespace Home\Controller;
    use Think\Controller;

    class HtmlController extends Controller{
    	public function index(){
    		$this->html_before('','static1',30);
    		//以下是一堆逻辑
    		$m_user = D('user');
    		$m_user->select();
    		......
    		$this->html_after();
    	}
    }
 ?>

此时html_before里的路径为要生成的静态文件
html_after里的参数和display的参数一样,为渲染的模板

当然有需要可以封装成类,这里删除缓存的方法没有写,可以自己扩展,其实就是重构对应路径的生成方法,然后Storage::unlink($path)即可,有问题欢迎来信

so,问题来了,thinkphp的自带究竟如何生成html静态页面呢?
这里试验是在非common模块里的配置,如果要在全局common下配置自行操作,
如:Home/Conf/config.php

 <?php
return array(
 //'配置项'=>'配置值'
 'HTML_CACHE_ON' => true, // 开启静态缓存
 'HTML_CACHE_TIME' => 60, // 全局静态缓存有效期(秒)
 'HTML_FILE_SUFFIX' => '.shtml', // 设置静态缓存文件后缀
 'HTML_CACHE_RULES' => array( // 定义静态缓存规则
 // // 定义格式1 数组方式
 //'静态地址' => array('静态规则', '有效期', '附加规则'),
 //1.任意控制器的任意操作都适用
 '*'=>array('{$_SERVER.REQUEST_URI|md5}'),
 //2.任意控制器的md5操作
 'md5'=>array('{:module}/{:controller}/{:action}_{id|md5}'),
 //3.Static控制器的所有操作
 'Static:'=>array('{:module}/{:controller}/{:action}',50)//第一个参数是构造的字符串,后面是缓存50秒
 //4.Hmtl控制器的md5操作
 'Html:md5'=>array('{:module}/{:controller}/{:action}'),
 )
);

其中1、2、3和1、2、4的组合是有可能冲突的,优先级是往下优先级越高,

下面给出一段示例代码:

 <?php
namespace Home\Controller;
use Think\Controller;

class HtmlController extends Controller{
         public function read(){
                 $this->assign('title','hellllo');
                 sleep(5);//再次刷新,即缓存后不需要等5s
                 $this->display();
         }
}

这里有个地方需要注意,就是要有渲染的模版(指的是display渲染函数,其他渲染函数没试验),否则不能缓存,ok,可以愉快的玩耍了

转载请注明:爱游思 » thinkphp实现html静态缓存

喜欢 (34)

您必须 登录 才能发表评论!

(1)个小伙伴在吐槽
  1. 收藏了
    梦浪2016-07-30 17:43