thinkphp页面真静态化实现方法

2025-09-24 13:40:36

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

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

thinkphp页面真静态化实现方法

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; //返回写入标识[成功/失败]

    }

thinkphp页面真静态化实现方法

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;//执行失败

        }

    }

thinkphp页面真静态化实现方法

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

thinkphp页面真静态化实现方法

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='新闻栏目表';

thinkphp页面真静态化实现方法

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;

        }

    }

thinkphp页面真静态化实现方法

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='新闻表';

thinkphp页面真静态化实现方法

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;

        }

    }

thinkphp页面真静态化实现方法

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

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

thinkphp页面真静态化实现方法

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢