ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 知识点: 1、工作思路 2、前台链接修改 3、链接地址静态化 4、后台静态生成模板搭建 5、全站静态化生成 6、封装生成静态化方法 7、内容页生成 8、列表页生成 [TOC] ## 一、工作思路 ### 1、相关文章 ThinkPHP5.0---静态方法 https://www.cnblogs.com/qq597585136/p/7228678.html ThinkPHP 的页面静态化功能的实现(一) https://blog.csdn.net/sinat_35861727/article/details/54971392 ThinkPHP 的页面静态化功能的实现(二) https://blog.csdn.net/sinat_35861727/article/details/54971805 ThinkPHP 的页面静态化功能的实现(三) https://blog.csdn.net/sinat_35861727/article/details/54972916 thnkphp5行为扩展html静态缓存源码下载 http://www.yunshare.net/Article/12/7.html 当后台开启静态(即判断 static==1 ),那么前台控制器就要控制链接地址为静态链接,否则就是动态链接 具体实现,就是在前台初始化操作中判断 ### 2、控制器设置 ~~~ public function _initialize() { // 判断缓存中是否有静态化配置项 if(!cache('static')){ $static = DB::name('config')->where('varname','static')->value('value'); cache('static',$static); } $this->assign('static',cache('static')); } ~~~ ### 3、模板判断 内容动态链接 http://www.demo.cn/index/index/show/id/87/catid/28.html 内容静态链接 http://www.demo.cn/show_x_y.shtml 模板中判断是否开启静态 ~~~ {if condition='$static'}../show_{$vo.catid}_{$vo.id}.shtml{else/}{:url('show',['id'=>$vo.id,'catid'=>$vo.catid])}{/if} ~~~ ## 二、前台链接修改 ### 1、分类链接 分类动态链接 http://www.demo.cn/index/index/fenlei/id/28.html?page=1 分类静态链接 http://www.demo.cn/list_x_y.shtml 备注:x-分类id,y-分页 ### 2、内容链接 内容动态链接 http://www.demo.cn/index/index/show/id/87/catid/28.html 内容静态链接 http://www.demo.cn/show_x_y.shtml 备注:x-分类id,y-内容id ## 三、链接地址静态化 ### (一)后台设置静态开关 ~~~ public function _initialize() { // 判断缓存中是否有静态化配置项 if(!cache('static')){ $static = DB::name('config')->where('varname','static')->value('value'); cache('static',$static); } $this->assign('static',cache('static')); } ~~~ ### (二)前台判断 ~~~ http://www/index/index/category/id/28.html?page=1 http://www/category_x_y.shtml [x-分类id,y-分页] {if condition='$static'}../category_{$vo.id}_1.shtml{else/}{:url('category',['id'=>$vo.id])}{/if} http://www/index/index/info/id/87/catid/28.html http://www/show_x_y.shtml [x-分类id,y-内容id] {if condition='$static'}../show_{$vo.catid}_{$vo.id}.shtml{else/}{:url('info',['id'=>$vo.id,'catid'=>$vo.catid])}{/if} 首页文章 <a href="{if condition='$static'}../show_{$vo.catid}_{$vo.id}.shtml{else/}{:url('info',['id'=>$vo.id,'catid'=>$vo.catid])}{/if}"> <img src="__UPLOADS__/{$vo.thumb}" alt="{$vo.title}"> </a> 首页分类 <a href="{:url('category',['id'=>$vo.catid])}">{$vo.catid|getCatInfoById=catname}</a> 列表页文章 <a href="{if condition='$static'}../../../../show_{$vo.catid}_{$vo.id}.shtml{else/}{:url('info',['id'=>$vo.id,'catid'=>$vo.catid])}{/if}" rel="bookmark"> {$vo.title} </a> 列表页分类 <a href="{if condition='$static'}../../../../list_{$vo.catid}_1.shtml{else/}{:url('category',['id'=>$vo.catid])}{/if}"> {$vo.catid|getCatInfoById=catname} </a> 内容页文章 <a href="{if condition='$static'}http://{$Think.server.HTTP_HOST}/show_{$vo.catid}_{$vo.id}.shtml{else/}{:url('info',['id'=>$vo.id,'catid'=>$vo.catid])}{/if}"> <img src="__UPLOADS__/{$vo.thumb}" alt="{$vo.title}"> </a> 内容页分类 <a href="{if condition='$static'}http://{$Think.server.HTTP_HOST}/list_{$vo.catid}_1.shtml{else/}{:url('category',['id'=>$vo.catid])}{/if}"> {$vo.catid|getCatInfoById=catname} </a> 菜单项 <ul class="sub-menu"> {volist name="vo.son" id="voson"} <li> <a href="{if condition='$static'}http://{$Think.server.HTTP_HOST}/list_{$voson.id}_1.shtml{else/}{:url('category',['id'=>$voson.id])}{/if}"> {$voson.catname} </a> </li> {/volist} </ul> ~~~ ## 四、后台静态生成模板搭建 ### (一)新建“发布管理”菜单 1、菜单>发布管理>静态生成 2、新建控制器Staticpage和模板“staticpage/index” 3、完善控制器和模板 ## 五、全站静态化生成 主要目标:生成首页 ~~~ public function index(){ $url = 'http://www/index.php'; //动态页面地址 $fn = ROOT_PATH . 'public/index.html'; //生成文件名 $content = file_get_contents($url); $fs = fopen($fn, 'w'); fwrite($fs, $content); return view(); } ~~~ ## 六、封装生成静态化方法 ~~~ protected $domain = ''; public function _initialize(){ $this->domain = "http://" . input('server.HTTP_HOST'); // 获取域名 } public function createHtml($visitUrl, $createName){ $url = $this->domain . '/index.php/index/index/' . $visitUrl; //动态页面地址 $fn = ROOT_PATH . 'public/' . $createName; //生成文件名 $content = file_get_contents($url); $fs = fopen($fn, 'w'); fwrite($fs, $content); } ~~~ ## 七、内容页生成 ~~~ public function createInfo(){ if(request()->isPost()){ // 获取模型中所有的tablename $models = Db::name('models')->column('tablename'); foreach ($models as $name) { $lists = Db::name($name)->field('id,catid')->select(); if(count($lists)){ foreach ($lists as $value) { $visitUrl = 'info/id/'.$value['id'].'/catid/'.$value['catid']; $createName = 'a/show_'.$value['catid'].'_'.$value['id'].'.shtml'; $this->createHtml($visitUrl, $createName); } } } return success('内容页生成成功!'); } } ~~~ ## 八、列表页生成 ### (一)思路分析 顶层分类没有文章的 每个分类ID对应一个模型ID 每个模型对应一张数据表 查询数据表分页操作 两个参数:一个是分类ID;一个是页数 页数:总共记录数;每页显示多少条 配置文件:\application\index\config.php 算法:$num = ceil($count/5); //进一取整函数 ceil() 函数向上舍入为最接近的整数。 返回不小于 x 的下一个整数,x 如果有小数部分则进一位。 ceil() 返回的类型仍然是 float,因为 float 值的范围通常比 integer 要大。 功 能:返回大于或者等于指定表达式的最小整数 ### (二)分页配置 ~~~ <?php return [ 'paginate' => [ 'type' => 'layui', 'var_page' => 'page', 'list_rows' => '5', 'newstyle' => true, ], ]; ~~~ ### (三)后台操作 #### 1、生成分类 ~~~ public function createCategory(){ if(request()->isPost()){ $ids = Db::name('category')->where('modelid','neq',0)->column('id'); foreach ($ids as $id) { // 根据分类ID获取相应数据表名 $tablename = getModInfoById($id, 'tablename'); // 获取数据表中相应分类记录数,再计算出页数 $count = Db::name($tablename)->where('catid', $id)->count(); if($count){ $num = ceil($count/5); //进一取整函数 for($i = 1; $i<$num+1; $i++){ $visitUrl = 'category/id/'.$id.'?page='.$i; $createName = 'a/list_'.$id.'_'.$i.'.shtml'; $this->createHtml($visitUrl, $createName, true, $id); } } } return success('分类页生成成功!'); } } ~~~ #### 2、根据分类ID获取相应模型信息 ~~~ function getModInfoById($id=0, $field=''){ //模型ID、 $modelId = getCatInfoById($id, 'modelid'); if($field == ''){ //获取单条数据 return Db::name('models')->where('id',$modelId)->find(); }else{ //获取某个字段 return Db::name('models')->where('id',$modelId)->value($field); } } ~~~ #### 3、创建静态页 ~~~ public function createHtml($visitUrl, $createName){ $url = $this->domain . '/index.php/index/index/' . $visitUrl; //动态页面地址 $fn = ROOT_PATH . 'public/' . $createName; //生成文件名 $content = file_get_contents($url); $fs = fopen($fn, 'w'); fwrite($fs, $content); } ~~~ #### 4、创建静态页升级 动态支持列表页传递页码参数 ~~~ public function createHtml($visitUrl, $createName, $hasPage = false, $catid = 0){ $url = $this->domain . '/index.php/index/index/' . $visitUrl; //动态页面地址 $fn = ROOT_PATH . 'public/' . $createName; //生成文件名 $content = file_get_contents($url); if($hasPage){ $content = preg_replace("(<a[^>]*page[=|/](\d+).+?>(.+?)<\/a>)", "<a href='category_".$catid."_$1.shtml'>$2</a>", $content); } $fs = fopen($fn, 'w'); fwrite($fs, $content); } ~~~