thinkphp页面真静态化实现方法

2022年2月18日 26点热度 0人点赞

常说的页面静态有两种,一种是伪静态,即url 重写,一种是真静态化。

下面小编给大家介绍一下真静态化

工具/原料

  • thinkphp
  • php
  • sublime

方法/步骤

  1. 1

    在执行之前,要在根目录下的程序入口文件index.php中进行如下配置:

    //生成静态页面的文件位置define('HTML_PATH', './HTML/');

  2. 2

    参数分别为(栏目或内容的URL路径,静态文件保存路径,生成静态文件的文件名):

    function createHtml($url,$dir,$filename){

            $content = file_get_contents($url); //获取内容

            if (!is_dir($dir)){        

                mkdir(iconv("UTF-8", "GBK", $dir),0777,true);   //创建目录(777权限)

            }

            //处理导航链接

            $listurls = "/[\'|\"]\/Admin\/list\/articleList\/id\/(.*?)[\'|\"]/";

            preg_match_all($listurls,$content,$matchlist);//根据需求自行修改正则

            foreach ( $matchlist[1] as $key => $value ) {

                $value = trim($value);

                $where['url'] = $value;

                $cat = M('category')->where($where)->limit(1)->find();

                $listurl = "\"/".$dir."/".$value.".html\"";

                $content = str_replace ( $matchlist[0][$key], $listurl, $content );

            }

            //处理文章列表页

            //列表页链接进入内容页

            $infourl = "/href=[\'|\']\/App\/list\/articleInfo\/id\/(.*?)[\'|\']/";

            preg_match_all($infourl,$content,$matchlist);//根据需求自行修改正则

            foreach($matchlist[1] as $key => $value){

                $value = trim($value);

                $where['id'] = $value;

                $cateid = M('article')->where($where)->limit(1)->getField('category_id');

                $cat = M('category')->where('id=' . $cateid)->limit(1)->find();

                $info = "href='/".$dir."/".$cat['url']."/".$value.".html'";

                $content = str_replace ( $matchlist[0][$key], $info, $content );

            }       

            //文章列表分页

            $page = "/<a (.*?) href=[\'|\"]\/Admin\/List\/articleList\/id\/(.*?)\/p\/(.*?)[\'|\"]>/";

            preg_match_all($page,$content,$matchpage);

            foreach ( $matchpage[3] as $key1 => $value1 ) {

                foreach ( $matchpage[1] as $key2 => $value2 ) {

                    if($key1 == $key2){

                        $value1 = trim($value1);

                        $value2 = trim($value2);

                        $url = '<a '.$value2.' href="/'.$dir.'/index_'.$value1.'.html">';

                        $content = str_replace ( $matchpage[0][$key1], $url, $content );

                    }

                }

            }         //生成的文件路径与文件名

            $path = $dir."/".$filename.".html";

            if(file_exists($path)){

                unlink($path);  //删除已有的同名文件

            }

            //打开文件,如果文件不存在则尝试创建之。        $fp = fopen($path, "w");            $flag = fwrite($fp, $content);//写入内容

            fclose($fp);

            return $flag; //返回写入标识[成功/失败]

        }

  3. 3

    //列表页面静态化

        public function sethtml(){

            $id = I("param.id","","trim");

            $m = M('category');

            if (!$id) {

                return 0;//执行失败

            }

            $catdir = trim($id);

            $where['id']=$catdir;

            $cat = $m->where($where)->limit(1)->find();

            if (empty($cat)) {

                return 0;//执行失败

            }

            $psize = 10; //每个分页展示几条数据

            $where['category_id'] = $cat['id'];

            $count = M('article')->where($where)->count();//当前分类下文章总数

            $pagecount = ceil(intval($count)/intval($psize));   //分页数(向上取整)

            $host = I("server.HTTP_HOST");

            //多页面,列表分页

            if($pagecount > 1){

                for($i=1;$i<=$pagecount;$i++){

                    $url = 'http://'.$host.'/Admin/list/articleList/id/'.$catdir.'/p/'.$i.'';

                    $dir = "./news/".A("base")->getPinyin($cat['name']);

                    $dirs = "./news";

                    $filename = 'index_'.$i; //分类名[当前文件名]

                    $res = $this->createHtml($url,$dir,$filename);//创建静态文件

                    if(!$res){

                        $save = "/news/".A("base")->getPinyin($cat['name']);

                        $up_url = M("category")->where("id = '$id'")->setfield("url",$save);

                        return 0;//执行失败

                    }

                }

            }

            //单页面

            $url = 'http://'.$host.'/Admin/list/articleList/id/'.$catdir.'';

            $dir = "./news/".A("base")->getPinyin($cat['name']);

            $dirs = "./news";

            $filename = 'index';                    //分类名当文件名

            $res = $this->createHtml($url,$dir,$filename);

            if($res){

                $save = "/news/".A("base")->getPinyin($cat['name']);

                $up_url = M("category")->where("id = '$id'")->setfield("url",$save);

                return 1;//执行成功

            }else{

                return 0;//执行失败

            }

        }

  4. 4

    列表页静态化的‍难点就是,根据不同分页链接中的p参数的不同进行静态化,在判断当前有几个分页之后,如果只有一个页面就生成一个文件,如果有多个就循环执行生成多个文件。

  5. 5

    CREATE TABLE `news_category` (

      `id` int(11) NOT NULL AUTO_INCREMENT,

      `pid` int(11) NOT NULL,

      `name` varchar(20) NOT NULL COMMENT '类别名称',

      `alias` varchar(20) NOT NULL COMMENT '别名',

      `sort` int(11) NOT NULL COMMENT '排序',

      `url` varchar(255) NOT NULL,

      `lv` int(11) NOT NULL,

      PRIMARY KEY (`id`)

    ) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COMMENT='新闻栏目表';

  6. 6

    //内容页面静态化

        public function sethtmls(){

            $id = I("param.id","","trim");

            if (!$id) {

                return 0;

            }

            $where['id'] = $id;

            $cateid = M('article')->where($where)->limit(1)->getField('category_id');

            $cat = M('category')->where('id=' . $cateid)->limit(1)->find();

            if (empty($cat)) {

                return 0;

            }

            $dir = "./news/".A("base")->getPinyin($cat['name'])."/".date("Ymd");

            $host = I("server.HTTP_HOST");

            $url = 'http://'.$host.'/Admin/list/articleInfo/id/'.$id.'';   

            $filename = $id;        //ID当文件名

            $res = $this->createHtml($url,$dir,$filename);

            if($res){

                $save = "news/".A("base")->getPinyin($cat['name'])."/".date("Ymd")."/".$id.".html";

                $up_url = M("article")->where("id = '$id'")->setfield("url",$save);

                return 1;

            }else{

                return 0;

            }

        }

  7. 7

    CREATE TABLE `news_article` (

      `id` int(11) NOT NULL AUTO_INCREMENT,

      `category_id` int(11) NOT NULL COMMENT '新闻栏目id',

      `publisher` int(11) NOT NULL COMMENT '发布者',

      `title` varchar(50) NOT NULL COMMENT '文章标题',

      `content` text NOT NULL COMMENT '新闻内容',

      `keywords` varchar(255) NOT NULL COMMENT '关键字',

      `flag` varchar(11) NOT NULL COMMENT '属性',

      `description` varchar(255) NOT NULL COMMENT '描述',

      `img` varchar(255) NOT NULL,

      `url` varchar(255) NOT NULL COMMENT '静态url',

      `addtime` varchar(20) NOT NULL COMMENT '添加时间',

      PRIMARY KEY (`id`)

    ) ENGINE=MyISAM AUTO_INCREMENT=51 DEFAULT CHARSET=utf8 COMMENT='新闻表';

  8. 8

    //首页页面静态化

        public function setindexhtml(){

            $host = I("server.HTTP_HOST");

            $url = 'http://'.$host.'/Admin/list/article';

            $dir = './';               //存放路径

            $filename = 'index';       //分类名当文件名

            $res = $this->createHtml($url,$dir,$filename);

            if($res){

                return 1;

            }else{

                return 0;

            }

        }

  9. 9

    注意页面模板引用的css,js的地址

    防止生成的静态页面找不到对应的css,js路径

    END

注意事项

  • 帮忙点赞、投票哦!!!
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。

展开阅读全部

laozhao

这个人很懒,什么都没留下

文章评论