常说的页面静态有两种,一种是伪静态,即url 重写,一种是真静态化。
下面小编给大家介绍一下真静态化
工具/原料
-
thinkphp
-
php
-
sublime
方法/步骤
-
1
在执行之前,要在根目录下的程序入口文件index.php中进行如下配置:
//生成静态页面的文件位置define('HTML_PATH', './HTML/');
-
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
//列表页面静态化
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
列表页静态化的难点就是,根据不同分页链接中的p参数的不同进行静态化,在判断当前有几个分页之后,如果只有一个页面就生成一个文件,如果有多个就循环执行生成多个文件。
-
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
//内容页面静态化
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
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
//首页页面静态化
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
注意页面模板引用的css,js的地址
防止生成的静态页面找不到对应的css,js路径
END
注意事项
-
帮忙点赞、投票哦!!!
文章评论