thinkphp6真正的静态化

代码编程 Loading... 阅读

关于如何生成thinkphp6的静态网页:

//多层目录创建
function mkdirs_1($path, $mode = 0777) {
	if(is_dir($path)) {
		return false;
	} else {
		if(mkdir($path, $mode, true)) {
			return true;
		} else {
			return false;
		}
	}
}
//判断是否存在静态
public function beforeBuild($param = [],$type) {
	//生成静态
	$this->staticHtmlDir = "static-cache".DS."post".DS;
	$param = $param[0][0];
	$this->staticHtmlFile = $this->staticHtmlDir . $param .'.html';
	//目录不存在,则创建
	if(!file_exists($this->staticHtmlDir)) {
		mkdir($this->staticHtmlDir,'511',true);
	}
	//文章不需要经常更新,静态存在一个月
	if(file_exists($this->staticHtmlFile) && filectime($this->staticHtmlFile)>=time()-2626560) {
		$new_url = str_replace('static-cache/','',$this->staticHtmlFile);
		header("Location:/" . $new_url);
		exit();
	}
}
//开始生成静态文件
public function afterBuild($html) {
	if(!empty($this->staticHtmlFile) && !empty($html)) {
		if(file_exists($this->staticHtmlFile)) {
			\unlink($this->staticHtmlFile);
		}
		if(file_put_contents($this->staticHtmlFile,ArticleAttribute::yasuo_html($html)."\n<!--生成静态时间:".date('Y年m月d日 H时i分s秒').",By html static.-->")) {
			$aaaaa = str_replace('index.html','',$this->staticHtmlFile);
			$new_url = str_replace('static-cache/','',$aaaaa);
			header("Location:/" . $new_url);
			exit();
		}
	}
}
/**
     * 文章页生成静态 
    */
public function getList($id = '',$view,$type) {
	//判断静态界面是否存在
	$this->beforeBuild(array($id),$type);
	// do someing
	$name = "测试静态化";
	$html = View::fetch($view,['name'=>$name]);
	//生成静态界面
	$this->afterBuild($html);
}

把上面的代码放在一个公共类里面即可,之后在对应的操作分组中调用,把需要的参数传输过来就行。

        // 执行生成静态
        $kaiqi=sysconfig('system','jingtai');
        if($kaiqi == 1){
            $jingtai->getIndex('首页','/index_index','html');
        }else{
            return ArticleAttribute::yasuo_html($this->fetch());
        }

先获取系统的设置,$kaiqi 如果值为 1 ,则进行静态,值为 0 ,则动态输出。

需要说明一下,上面的代码还有完善空间,如果直接放在网页的默认目录下面,代码还可以精简,像重定向这些就不需要切割多余的路径,直接定向 $this->staticHtmlFile 这个就行,在新能上要更好一点。

生成之后基本上所有的访问都是通过 Location 重定向完成的。

thinkphp6真正的静态化

使用 Nginx 伪静态规则定义:

beforeBuild 方法中,重定向也不需要了,直接通过我下面的nginx规则就能访问,afterBuild 方法中的定向需要原样保持,因为生成文件之后运行依旧在这个方法中,不进行重定向就无法正常访问网页,除非在 getList 方法最下面加重定向,这种方法多次一举。后续访问都直接通过nginx伪静态规则忽略掉static-cache目录和index.html,保持动态一致的路径。

location / {
    gzip_static always;
    gunzip on;

    if (-f $request_filename) {
        break;
    }
    if ($uri ~ /(.*)$){
        set $wpuri $1;
        set $sscfile $document_root/static-cache/$1;
    }
    set $ssc Y;
    if ($query_string !~ .*=.*){
        set $ssc "${ssc}Y";
    }
    if ($request_method != "POST"){
        set $ssc "${ssc}Y";
    }

    if (-f $sscfile){
        set $ssc "${ssc}F";
    }
    if (-f $sscfile/index.html){
        set $ssc "${ssc}I";
    }
    if ($ssc = YYYF){
        rewrite . /static-cache/$wpuri break;
    }
    if ($ssc = YYYI){
        rewrite . /static-cache/$wpuri/index.html break;
    }
	if (!-e $request_filename){
	  rewrite  ^/(\d+).html  http://$host/post/$1.html permanent;
	  rewrite  ^/html/(\d+).html  http://$host/post/$1.html permanent;
	  rewrite  ^(.*)$  /index.php?s=$1  last;   break;
	}
}

至此,就是我初步在thinkphp6上实现的真正的静态化网站。

Tags:

版权声明:若无特殊注明,本文皆为《书蓝画青》原创,转载务必保留文章来源。

本文链接:thinkphp6真正的静态化 & https://boke.slhq.cn/1922.html

推荐阅读
分享