1. 程式人生 > >ThinkPHP5中如何實現模板完全靜態化

ThinkPHP5中如何實現模板完全靜態化

    模板完全靜態化,也就是通過模板完全生成純靜態的網頁,相比動態頁面和偽靜態頁面更安全更利於SEO訪問更快。相比前二者各有利弊吧,現在稍微對這三種形式的優缺點對比一下,以及在ThinkPHP5專案中實現完全靜態化的基本過程。

 

對比

1. 動態與真靜態

        頁面靜態化與動態頁的對比,靜態沒有了SQL和一些後端指令碼執行,安全穩定,訪問速度快,對SEO友好(網上也有說現在的搜尋引擎已經對動態網頁的抓取沒什麼壓力了),但是搜尋引擎再強大,靜態的URL也比動態的後面帶問號冒號什麼的要好看,不對SEO友好對普通瀏覽使用者者也是友好(好看第一)。但是生成靜態頁面的弊端,也就是如果一個部落格網站,隨著文章內容的增多,那生成的頁面也不斷增多,就算一個html就30幾Kb,數量多的情況下也挺耗儲存空間,網上也有說頻繁生成靜態頁面化,容易讓硬碟出現壞道。這個我的看法是不好測試可以忽略,因為現在多數是使用雲伺服器或雲虛擬主機,那些都不是物理硬體,就算太過碎片導致硬碟損壞,網站也能正常訪問的,因為那是雲伺服器。

 

2. 真靜態與偽靜態

        這二者的對比看起來像是正統之爭,因為大家都知道偽靜態還是動態頁,只是Apache通過URL重寫規則讓其變成了像靜態網頁的樣子。主要也是讓自己對SEO友好,但是相比真靜態多了Apache的步驟,所以也就比較耗費一些伺服器的資源。而真靜態的缺點上面也說了,在專案中的選擇看需求,各有利弊,北橋蘇的使用主要是自己網站有時要優化一下速度所以就做了模板靜態化,以下是操作過程。

 

實現思路

1. 根據模組控制器自動遞迴建立目錄。

2. file_exists判斷生成的靜態頁是否存在

3. 或判斷過期與否,存在重定向到靜態網頁

4. file_put_contents($file,$content)函式生成頁面。

 

編碼

1. 目錄的建立

/*
 * 遞迴建立目錄
 * @param string $dir 檔案目錄路徑
 * @return boolean 建立結果
 * **/
function mkdirs($dir)
{
    if(!is_dir($dir))
    {
        if(!mkdirs(dirname($dir))){
            return false;
        }
        if(!mkdir($dir,0777)){
            return false;
        }
    }
    return true;
}

 

2. 在基類中初始化需建立的目錄

protected $staticHtmlDir = "";              //靜態模板生成目錄
protected $staticHtmlFile = "";             //靜態檔案


protected function _initialize() {
      parent::_initialize();

      $this->staticHtmlDir = "html".DS.$this->request->controller().DS;



//……………………………………………………………………

 

3. 基類中的生成前與生成後的方法。

//判斷是否存在靜態
public function beforeBuild($param) {
        //生成靜態
        //$baseDir = "html".DS.$this->request->controller().DS;
        if(is_array($param)) {
            $param = implode("_",$param);
        }
        $this->staticHtmlFile = $this->staticHtmlDir.$this->request->action().($param?$param:'').'.html';

        if(mkdirs($this->staticHtmlDir)) {
            if(file_exists($this->staticHtmlFile) && filectime($this->staticHtmlFile)>=time()-60*60*24*5) {                  //靜態檔案存在
                $this->redirect('/'.$this->staticHtmlFile);
            }
        }
    }



//開始生成靜態檔案
public function afterBuild($html) {
        if(!empty($this->staticHtmlFile) && !empty($html)) {
            if(file_exists($this->staticHtmlFile)) {
                unlinnk($this->staticHtmlFile);
            }
            if(file_put_contents($this->staticHtmlFile,$html)) {
                $this->redirect('/'.$this->staticHtmlFile);
            }
        }
    }

 

4. 檢視控制器中的使用。

ThinkPHP5中fetch方法返回給file_put_contents函式作為content就可以生成一個完整的靜態頁面了。

 

相關推薦

ThinkPHP5如何實現模板完全靜態

    模板完全靜態化,也就是通過模板完全生成純靜態的網頁,相比動態頁面和偽靜態頁面更安全更利於SEO訪問更快

php使用ob緩存來實現動態頁面靜態

數據庫操作 rom sql name con pre 頁面靜態化 nts lec 例子: <?phpinclude_once ‘common/common.php‘;//數據庫操作方法$fileName = ‘test.html‘;$expr = 10;//緩存時間$

FreeMarker實現動態網頁靜態

眾所周知,隨著網站的訪問量增加,如何給使用者以良好的訪問體驗就顯得尤為重要。提升網站效能便成為一些網站面臨的一大難題,像hao123這樣的導航網站要提升網站的效能只要部署的web伺服器數量足夠就可以承載超大規模的訪問量,如果是一個動態的網站呢?例如像鳳凰新聞、網

【phpcms-v9】phpcms-v9欄目頁的靜態生成

一、phpcms-v9中欄目頁的靜態化生成在phpcms/modules/content/create_html.php控制器中的category()方法 有時候我們不希望某些特定的欄目生成靜態頁,這時候我們該怎麼辦呢?為了測試方便,複製category(),並命名為ca

thinkphp5模板引擎

1、thinkphp5自帶的模板引擎和tp3中的模板引擎基本一致2、twig模板引擎http://www.thinkphp.cn/topic/43078.html3、Laravel Blade模板引擎http://www.thinkphp.cn/extend/946.html

怎樣使用FreeMarker來實現動態網頁靜態

眾所周知,隨著網站的訪問量增加,如何給使用者以良好的訪問體驗就顯得尤為重要。提升網站效能便成為一些網站面臨的一大難題,像hao123這樣的導航網站要提升網站的效能只要部署的web伺服器數量足夠就可以承載超大規模的訪問量,如果是一個動態的網站呢?例如像鳳凰新聞、網易新聞這樣的

php頁面靜態實現頁面純靜態的原理

php實現頁面純靜態化的最終目的就是生成純html檔案,而這個純html檔案就存放在伺服器的磁碟當中; php實現頁面純靜態化需要的東西: 1、檔案寫入函式 file_put_contents()、或

C++模板與用C語言實現模板

1、模板的概念 我們已經學過過載(Overloading),對過載函式而言,C++的檢查機制能通過函式引數的不同及所屬類的不同。正確的呼叫過載函式。例如,為求兩個數的最大值,我們定義MAX()函式需要對不同的資料型別分別定義不同過載(Overload)版本。 //函式

day76_淘淘商城專案_09_商品詳情頁動態展示實現(jsp+redis) + FreeMarker模板引擎入門 + 商品詳情頁靜態實現(Win版本的nginx作http伺服器)_匠心筆記

淘淘商城專案_09 1、商品詳情頁面展示,動態展示(jsp + redis) 1.1、工程搭建 1.1.1、pom檔案 1.1.2、框架整合 1.1.3、springmvc.xml

Asp.net動態頁面靜態之初始NVelocity模板引擎

實現 tracking ssr system uil 文件系統 處理程序 .ashx hosting Asp.net動態頁面靜態化之初始NVelocity模板引擎 靜態頁面是網頁的代碼都在頁面中,不須要運行asp,php,jsp,.net等程序生成client網頁代碼的

靜態模板Freemaker的基本語法

spa macro 數據模型 最終 pub ati -- keys string 首先,導入jar包 freemark的demo類: 1 public class FMDemo { 2 3 //實例化Freemarker 配置類 ftl

php利用ob緩存機制實現頁面靜態方法全解

常用函數 http協議 一個 src names too req 文件是否存在 復制 首先介紹一下php中ob緩存常用到的幾個常用函數 ob_start():開啟緩存機制 ob_get_contents():獲取ob緩存中的內容 ob_clean()清除ob緩存中的內容,但

[轉]C++模板的特與偏特

解析 匹配規則 創意 復雜 href 靈活 類模板特化 總結 行存儲 轉載自:http://hi.baidu.com/klcdyx2008/blog/item/5adbf77b79f316f90bd1873c.html 1.引言C++中的模板分為類模板和函數模板,雖然它引進

HTML頁面靜態實現

java靜態化文件位置註意:實體類定義:public class News { private String title; private String pubTime; private String category; private String newsContent; public

MOOC清華《面向對象程序設計》第8章:棧的實現(采用模板實例

com mooc html 程序 ndt wot 面向 tar dmz 3lztmo1xf豪已4茲6http://www.zcool.com.cn/collection/ZMTkxNTY1OTI=.html 6桓50勞爻拍62誹喜0栽2http://www.zcool.c

嘗試在LwIP實現靜態路由表

number containe 1.2 etc add def tool span defined 在lwIP中實現路由表或轉發表,讓SNMP讀取 IP中的路由表或轉發表MIB經歷了一些變化,如下: 最早的MIB是RFC1156,1990年,叫ipRoutingTabl

Django2.0.3如何實現頁面靜態

django2.0.3 靜態化 我們在開發新聞系統的時候,為了提高系統的響應速度,通常我們會將常用的數據實現靜態化,我們如何將新聞內容實現靜態化呢?環境:Python3.5 + Django2.0.3 引入模塊: from django.shortcuts import renderfrom .mod

將網上的內容,讀取到指定文件【頁面靜態

+= rgs 技術 sender AS 一個 click AR 代碼 出錯: 已經將指定頁面的內容讀取到了test.html文件中,但是頁面中有很多的亂碼。 以下是一個簡單的,將aspx文件生成靜態html文件的代碼 protected void Button1_C

zblog2.3的缺點:純靜態無法實現欄目名加id的網址結構[圖]

無奈 依然 網頁 靜態 缺點 讀書筆記 興趣 後臺 小王子 寫博客應半年了,因為對程序語言比較感興趣,因此也關註博客系統的發展,對於國內博主來說,ZBLOG似乎是最佳的選擇,功能比較完善,也比較好修改模板,當然,你還需要寫CSS代碼,模板裏面基本都用標簽完成的,這基本就是模

MATLAB實現資料 [0,1] 歸一

記錄一下,在做機器學習時,資料處理部分要花很多精力。資料處理的方式有很多種,今天記錄的是[0,1]歸一化,該法可以避免在較大數值範圍內的特性凌駕於較小數值範圍內的特性,先看下原理。 設序列代表特性A,對它們進行變換 則得到的新序列 下面看程式碼: clc clear all %