(4)php框架开发---模板静态化处理

来源:互联网 发布:端口攻击器 编辑:程序博客网 时间:2024/05/29 10:34

   在这次的技术讨论是,如何使用php原生来做模板语言,抛弃笨重的smarty等框架。因为php本身就是很好的模板语言来的,所以基本上可以直接使用原生php代码来做,这样子可以省略了正则表达式置换的问题出现。

   在做php静态化的时候,基本就是有两种方法:

  1. file_get_contents(http://文件地址)
  2. ob函数
   在这里我偏向于使用ob函数,ob函数常用方法如下:
ob_start();            //打开一个输出缓冲区,所有的输出信息不再直接发送到浏览器,而是保存在输出缓冲区里面。ob_clean();            //删除内部缓冲区的内容,不关闭缓冲区(不输出)。ob_end_clean();        //删除内部缓冲区的内容,关闭缓冲区(不输出)。ob_get_clean();        //返回内部缓冲区的内容,关闭缓冲区。相当于执行 ob_get_contents() and ob_end_clean()ob_flush();            //发送内部缓冲区的内容到浏览器,删除缓冲区的内容,不关闭缓冲区。ob_end_flush();        //发送内部缓冲区的内容到浏览器,删除缓冲区的内容,关闭缓冲区。ob_get_flush();        //返回内部缓冲区的内容,并关闭缓冲区,再释放缓冲区的内容。相当于ob_end_flush()并返回缓冲区内容。flush();               //将ob_flush释放出来的内容,以及不在PHP缓冲区中的内容,全部输出至浏览器;刷新内部缓冲区的内容,并输出。ob_get_contents();     //返回缓冲区的内容,不输出。ob_get_length();       //返回内部缓冲区的长度,如果缓冲区未被激活,该函数返回FALSE。ob_get_level();        //Return the nesting level of the output buffering mechanism.ob_get_status();       //Get status of output buffers.ob_implicit_flush();   //打开或关闭绝对刷新,默认为关闭,打开后ob_implicit_flush(true),所谓绝对刷新,即当有输出语句(e.g: echo)被执行时,便把输出直接发送到浏览器,而不再需要调用flush()或等到脚本结束时才输出。ob_gzhandler               //ob_start回调函数,用gzip压缩缓冲区的内容。ob_list_handlers           //List all output handlers in useoutput_add_rewrite_var     //Add URL rewriter valuesoutput_reset_rewrite_vars  //Reset URL rewriter values这些函数的行为受php_ini设置的影响:output_buffering       //该值为ON时,将在所有脚本中使用输出控制;若该值为一个数字,则代表缓冲区的最大字节限制,当缓存内容达到该上限时将会自动向浏览器输出当前的缓冲区里的内容。output_handler         //该选项可将脚本所有的输出,重定向到一个函数。例如,将 output_handler 设置为 mb_output_handler() 时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的处理输出缓冲。implicit_flush         //作用同ob_implicit_flush,默认为Off。

根据上面的ob函数,我们可以知道,使用ob_start,ob_get_contents,ob_clean这三个函数就可以实现基本的静态化了。
具体的文件布局如图:

这里面我首先定义一个cache类,这个类也在core文件目录下,这个类是用来编译cache文件,然后就是调用静态模板。在调用模板的时候,这里面会判断cache文件是否修改过,如果修改过了,那么我就重新编译cache文件,否则直接调用静态模板。
namespace core;class cache{    /*     * 显示模板     */    public function display($filename,$page=null){        $tpl_file = ROOT_PATH.'/'.MODULE_NAME.'/tpl/'.$filename.'.php';        $cache_file = ROOT_PATH.'/caches/'.MODULE_NAME.'/'.$filename.'.htm';//        判断文件是否被修改,未修改不用重新编译        if(!$this->cache($tpl_file,$cache_file)){            $this->compile($filename,$tpl_file,$cache_file,$page=null);        }        require_once($cache_file);    }    //判断模板是否缓存,如模板文件有更改则重新编译    function cache($tpl_file,$cache_file) {        if(!file_exists($cache_file) || filemtime($tpl_file)>filemtime($cache_file)){            return false;        }        return true;    }    /*     * 编译静态文件     */    public function compile($name,$tpl_file,$cache_file,$page=null){        ob_start(); //开启缓存区        require_once($tpl_file);        file_put_contents($cache_file,ob_get_contents());        if(!$page){            file_put_contents(ROOT_PATH.'/caches/'.MODULE_NAME.'/'.$name.'.htm',ob_get_contents());        }else{            file_put_contents(ROOT_PATH.'/caches/'.MODULE_NAME.'/'.$name.'_'.$page.'.htm',ob_get_contents());        }        ob_clean();//清空缓冲区    }}

基本的模板类做好后,就是整合到整个框架里面去了。这里,我会将cache类放到dphp.php这个文件里面。做成一个接口的形式来获取每个对象。直接根据(命名空间\类名)的形式传参进去就能获取到当前的类对象了。


然后就是在控制器类里面封装一个cache类来使用,在控制类里面我们可以将display这些函数封装起来,这样子的话就可以让我们和cache对象隔离了。


然后再模块控制器里面就可以直接使用display函数了,并且不用知道他是如何实现的。这里面要在display函数传一个cache文件名,在上面的项目图里面我们可以看到tpl/admin.php,所以这个参数就是这个文件的名字。


   然后你会发现,这样的做法明显无法显示数据变化的情况重新编译文件。所以为了让其实现这个效果,我们必须要借助ajax来实现。这里面我们将数据以接口的形式来表示,然后使用ajax获取到数据后,在客户端是用js或jq动态添加html代码,这样就实现了数据的动态变化了。




原创粉丝点击