1. 程式人生 > >ThinkPHP 的頁面靜態化功能的實現(三)

ThinkPHP 的頁面靜態化功能的實現(三)

常說的頁面靜態化分為兩種,一種是偽靜態,即url 重寫,一種是真靜態化。

前兩篇講了兩種靜態化方法,基本都是使用TP自帶的靜態化機制。但TP寫的網站頁面路由都比較繁瑣複雜,不利於引擎優化。

前段時間做了個網站,由於網站層次太深,在進行SEO優化的時候,不好收錄,無奈之下只得自己重新寫方法進行頁面靜態化,採用的方法就是:在後臺對每個欄目和內容手動點選進行靜態化。後臺新增欄目和文章之後手動點選生成靜態頁面檔案。

原理就是:每一個欄目或者內容都唯一的URL路徑,根據連結將內容提取出來,然後重新儲存檔案就是靜態化之後的檔案。頁面中原有的a標籤帶有的連結,都通過正則表示式匹配之後,重新替換,以保證在一個靜態頁面中點選連結跳轉到的下一個頁面也是HTML/目錄下的靜態化頁面。

先將自己寫的方法貼出來,引數分別為(欄目或內容的URL路徑,靜態檔案儲存路徑,生成靜態檔案的檔名):

  1. function createHtml($url,$dir,$filename){  
  2.     $content = file_get_contents($url);                 //獲取內容
  3.     if (!is_dir($dir)){                                 //如果目錄不存在
  4.         mkdir(iconv("UTF-8""GBK"$dir),0777,true);   //建立目錄(777許可權)
  5.     }  
  6.     //-------------------------------------------處理導航連結-------------------------
  7.     $listurls = "/[\'|\"]\/App\/Index\/articalList\/id\/(.*?)[\'|\"]/";  
  8.     preg_match_all($listurls,$content,$matchlist);  
  9.     foreach ( $matchlist[1] as$key => $value ) {  
  10.         $value = trim($value);  
  11.         $map['catdir'] = $value;  
  12.         $cat = M('cms_cate')->where($map)->limit(1)->find();  
  13.         if($cat['lv'] == 1){  
  14.             $listurl = "\"/HTML/".$value.".html\"";  
  15.         }elseif(!empty($cat['pid']) && ($cat['lv'] == 2)){  
  16.             $pid = $cat['pid'];  
  17.             $tmap['id']=$pid;  
  18.             $pcat = M('cms_cate')->where($tmap)->limit(1)->find();  
  19.             $pcatdir = $pcat['catdir'];  
  20.             $listurl = "\"/HTML/".$pcatdir."/".$value.".html\"";  
  21.         }  
  22.         $content = str_replace ( $matchlist[0][$key], $listurl$content );   
  23.     }  
  24.     //-----------------------------------------------------------------------------------
  25.     //------------------------------------處理文章列表頁---------------------------------
  26.     //列表頁連結進入內容頁
  27.     $infourl = "/href=[\'|\"]\/App\/Index\/articalInfo\/id\/(.*?)[\'|\"]/";  
  28.     preg_match_all($infourl,$content,$matchlist);  
  29.     foreach($matchlist[1] as$key => $value){  
  30.         $value = trim($value);  
  31.         $map['id'] = $value;  
  32.         $cateid = M('Artical')->where($map)->limit(1)->getField('cateid');  
  33.         $cat = M('cms_cate')->where('id=' . $cateid)->limit(1)->find();  
  34.         if($cat['lv'] == 1){  
  35.             $info = "href='/HTML/".$cat['catdir']."/".$value.".html'";  
  36.         }elseif(!empty($cat['pid']) && ($cat['lv'] == 2)){  
  37.             $pid = $cat['pid'];  
  38.             $tmap['id']=$pid;  
  39.             $pcat = M('cms_cate')->where($tmap)->limit(1)->find();  
  40.             $pcatdir = $pcat['catdir'];        
  41.             $info = "href='/HTML/".$pcatdir."/".$cat['catdir']."/".$value.".html'";  
  42.         }  
  43.         $content = str_replace ( $matchlist[0][$key], $info$content );   
  44.     }  
  45.     //文章列表分頁
  46.     $page = "/<a (.*?) href=[\'|\"]\/Index\/articalList\/id\/(.*?)\/p\/(.*?)[\'|\"]>/";  
  47.     preg_match_all($page,$content,$matchpage);  
  48.     foreach ( $matchpage[3] as$key1 => $value1 ) {  
  49.         foreach ( $matchpage[1] as$key2 => $value2 ) {  
  50.             if($key1 == $key2){  
  51.                 $value1 = trim($value1);  
  52.                 $value2 = trim($value2);  
  53.                 $url = '<a '.$value2.' href="/HTML/'.$matchpage[2][0].'_'.$value1.'.html">';  
  54.                 $content = str_replace ( $matchpage[0][$key1], $url$content );  
  55.             }  
  56.         }  
  57.     }   
  58.     //-----------------------------------------------------------------------------------
  59.     //生成的檔案路徑與檔名
  60.     $path = $dir."/".$filename.".html";  
  61.     if(file_exists($path)){  
  62.         unlink($path);                   //刪除已有的同名檔案
  63.     }  
  64.     //'w' 寫入方式開啟,將檔案指標指向檔案頭並將檔案大小截為零。如果檔案不存在則嘗試建立之。  
  65.     $fp = fopen($path"w");               
  66.     $flag = fwrite($fp$content);       //寫入內容
  67.     fclose($fp);  
  68.     return$flag;                        //返回寫入標識[成功/失敗]
  69. }  

不同的網站層級結構和路由規則不一樣,所以正則匹配規則也就不一樣了,大家可以根據自己的網站的路由規則進行靈活調整改動。


在執行之前,當然要在根目錄下的程式入口檔案index.php中進行如下配置:
  1. define('HTML_PATH''./HTML/');//生成靜態頁面的檔案位置

(1)網站首頁靜態化
  1. //首頁頁面靜態化
  2. publicfunction setindexhtml(){  
  3.     $host = I("server.HTTP_HOST");  
  4.     $url = 'http://'.$host.'/index.php';  
  5.     $dir = './';               //存放路徑
  6.     $filename = 'index';       //分類名當檔名
  7.     $res = createHtml($url,$dir,$filename);  
  8.     if($res){  
  9.         $this->ajaxReturn(array("status"=>"1","msg"=>"操作成功"));  
  10.     }else{  
  11.         $this->ajaxReturn(array("status"=>"0","msg"=>"操作失敗"));  
  12.     }  
  13. }  
將首頁靜態化之後生成的index.html檔案儲存在網站的根目錄下,在伺服器端設定程式入口檔案為index.html,如下圖:


這時候一訪問域名,其實就是訪問的根目錄下的index.html靜態檔案。而且首頁裡邊a標籤跳轉到其他頁面的連結也都被替換了,點選跳轉都會路由到HTML/目錄下,尋找對應要跳轉的檔名。

(2)文章列表頁靜態化

  1. //列表頁面靜態化
  2. publicfunction sethtml(){  
  3.     $_G = F('f_data');  
  4.     $id =  I("get.id");  
  5.     $m = M('cms_cate');  
  6.     if (!$id) {  
  7.         $info['status'] = 0;  
  8.         $info['msg'] = 'ID不能為空!';  
  9.         $this->ajaxReturn($info);  
  10.     }  
  11.     $catdir = trim($id);  
  12.     $map['catdir']=$catdir;  
  13.     $cat = $m->where($map)->limit(1)->find();  
  14.     if (empty($cat)) {  
  15.         $info['status'] = 0;  
  16.         $info['msg'] = '操作失敗,請檢查此分類!';  
  17.         $this->ajaxReturn($info);  
  18.     }  
  19.     $psize = $_G['pagesize']['svalue'];          //每個分頁展示幾條資料
  20.     $tmap['cateid'] = $cat['id'];  
  21.     $tmap['status'] = 1;  
  22.     if($cat['model'] == 'artical'){  
  23.         $count = M('artical')->where($tmap)->count();//當前分類下文章總數
  24.     }elseif($cat['model'] == 'product'){  
  25.         $count = M('product')->where($tmap)->count();  
  26.     }  
  27.     $pagecount = ceil(intval($count)/intval($psize));   //分頁數(向上取整)
  28.     $host = I("server.HTTP_HOST");  
  29.     //多頁面,列表分頁
  30.     if($pagecount > 1){  
  31.         for($i=1;$i<=$pagecount;$i++){  
  32.             $url = 'http://'.$host.'/App/Index/articalList/id/'.$catdir.'/p/'.$i.'';  
  33.             if($cat['lv'] == 1){  
  34.                 $dir = './HTML/';  //存放路徑
  35.             }elseif(!empty($cat['pid']) && ($cat['lv'] == 2)){   //當前類有父級分類
  36.                 $pid = $cat['pid'];  
  37.                 $tmap['id']=$pid;  
  38.                 $pcat = $m->where($tmap)->limit(1)->find();  
  39.                 $pcatdir = $pcat['catdir'];  
  40.                 $dir = './HTML/'.$pcatdir;    //存放路徑
  41.             }  
  42.             $filename = $catdir.'_'.$i;           //分類名[當前檔名]
  43.             $res = createHtml($url,$dir,$filename);//建立靜態檔案
  44.             if(!$res){  
  45.                 $this->ajaxReturn(array("status"=>"0","msg"=>"操作失敗"));exit();  
  46.             }  
  47.         }  
  48.     }  
  49.     //單頁面
  50.     $url = 'http://'.$host.'/App/Index/articalList/id/'.$catdir.'';  
  51.     if($cat['lv'] == 1){  
  52.         $dir = './HTML/';                //存放路徑
  53.     }elseif(!empty($cat['pid']) && ($cat['lv'] == 2)){  
  54.         $pid = $cat['pid'];  
  55.         $tmap['id']=$pid;  
  56.         $pcat = $m->where($tmap)->limit(1)->find();  
  57.         $pcatdir = $pcat['catdir'];  
  58.         $dir = './HTML/'.$pcatdir;      //存放路徑
  59.     }  
  60.     $filename = $catdir;                    //分類名當檔名
  61.     $res = createHtml($url,$dir,$filename);  
  62.     if($res){  
  63.         $this->ajaxReturn(array("status"=>"1","msg"=>"靜態頁面建立成功"));  
  64.     }else{  
  65.         $this->ajaxReturn(array("status"=>"0","msg"=>"操作失敗"));  
  66.     }  
  67. }  
列表頁靜態化的難點就在於分頁,根據不同分頁連結中的p引數的不同進行靜態化,在判斷當前有幾個分頁之後,如果只有一個頁面就生成一個檔案,如果有多個就迴圈執行生成多個檔案。如下圖:


(3)文章內容頁面靜態化

  1. //內容頁面靜態化
  2. publicfunction sethtml(){  
  3.     $id =  I("get.id");  
  4.     if (!$id) {  
  5.         $info['status'] = 0;  
  6.         $info['msg'] = 'ID不能為空!';  
  7.         $this->ajaxReturn($info);  
  8.     }  
  9.     $map['id'] = $id;  
  10.     $cateid = M('Artical')->where($map)->limit(1)->getField('cateid');  
  11.     $cat = M('cms_cate')->where('id=' . $cateid)->limit(1)->find();  
  12.     if (empty($cat)) {  
  13.         $info['status'] = 0;  
  14.         $info['msg'] = '操作失敗,請檢查此分類!';  
  15.         $this->ajaxReturn($info);  
  16.     }  
  17.     if($cat['lv'] == 1){  
  18.         $dir = './HTML/'.$cat['catdir'];     //存放路徑
  19.     }elseif(!empty($cat['pid']) && ($cat['lv'] == 2)){  
  20.         $pid = $cat['pid'];  
  21.         $tmap['id']=$pid;  
  22.         $pcat = M('cms_cate')->where($tmap)->limit(1)->find();  
  23.         $pcatdir = $pcat['catdir'];  
  24.         $dir = './HTML/'.$pcatdir.'/'.$cat['catdir']; //存放路徑
  25.     }  
  26.     $host = I("server.HTTP_HOST");  
  27.     $url = 'http://'.$host.'/App/Index/articalInfo/id/'.$id.'';  
  28.     $filename = $id;        //ID當檔名
  29.     $res = createHtml($url,$dir,$filename);  
  30.     if($res){  
  31.         $this->ajaxReturn(array("status"=>"1","msg"=>"靜態頁面建立成功"));  
  32.     }else{  
  33.         $this->ajaxReturn(array("status"=>"0","msg"=>"操作失敗"));  
  34.     }  
  35. }  
後臺每新增一篇文章,都手動進行靜態化一次,就會在HTML/目錄下先生成文章所在的分類目錄,然後以文章ID為名生成HTML檔案。比如某一篇新聞文章id為32,新聞在news欄目下,就會在HTML/news/目錄下生成32.html。


(4)一鍵靜態化當前分類下所有文章內容頁頁面

  1. //一鍵靜態化當前分類下所有文章內容頁頁面
  2. publicfunction sethtmlall(){  
  3.     C('DEFAULT_THEME','App/default/');  
  4.     $data = I('get.');  
  5.     $cateid = $data['cateid'];  
  6.     $map['cateid'] = $cateid;  
  7.     $map['status'] = 1;  
  8.     $artical = M('Artical')->where($map)->select();  
  9.     $cat = M('cms_cate')->where('id=' . $cateid)->limit(1)->find();  
  10.     if (empty($cat)) {  
  11.         $info['status'] = 0;  
  12.         $info['msg'] = '操作失敗,請檢查此分類!';  
  13.         $this->ajaxReturn($info);  
  14.     }  
  15.     $host = I("server.HTTP_HOST");  
  16.     foreach($articalas$key => $value){  
  17.         $url = 'http://'.$host.'/App/Index/articalInfo/id/'.$value['id'].'';  
  18.         if($cat['lv'] == 1){  
  19.             $dir = './HTML/'.$cat['catdir'];                     //存放路徑
  20.         }elseif(!empty($cat['pid']) && ($cat['lv'] == 2)){  
  21.             $pid = $cat['pid'];  
  22.             $tmap['id']=$pid;  
  23.             $pcat = M('cms_cate')->where($tmap)->limit(1)->find();  
  24.             $pcatdir = $pcat['catdir'];  
  25.             $dir = './HTML/'.$pcatdir.'/'.$cat['catdir'];        //存放路徑
  26.         }  
  27.         $filename = $value['id'];  
  28.         $res = createHtml($url,$dir,$filename);                  //建立靜態檔案
  29.         if(!$res){  
  30.             $this->ajaxReturn(array("status"=>"0","msg"=>"操作失敗"));exit();  
  31.         }  
  32.     }  
  33.     $this->ajaxReturn(array("status"=>"1","msg"=>"靜態頁面建立成功"));  
  34. }  
比如新聞欄目下有很多條文章,一條條手動靜態化太慢,可以實現一鍵靜態化。先在資料庫中查詢新聞文章,然後迴圈遍歷進行靜態化,就會在HTML/news/目錄下生成所有的新聞文章靜態頁面。如下圖:

此時再訪問網站,訪問的全部是靜態化的頁面,訪問的URL也會變為自定義的,簡化了網站的層級,便於引擎優化。

靜態化案例:

靜態化之前:http://www.anumuying.com/index.php

靜態化之後:http://www.anumuying.com

不同的網站層級結構和路由規則不一樣,所以URL不同,同時正則匹配規則也就不一樣了,大家可以根據自己的網站的路由規則進行靈活調整改動。

相關推薦

ThinkPHP頁面靜態功能實現()

常說的頁面靜態化分為兩種,一種是偽靜態,即url 重寫,一種是真靜態化。 前兩篇講了兩種靜態化方法,基本都是使用TP自帶的靜態化機制。但TP寫的網站頁面路由都比較繁瑣複雜,不利於引擎優化。 前段時間做了個網站,由於網站層次太深,在進行SEO優化的時候,不好收錄,無奈之下只得自己重新寫方法進行頁面靜態化,採用

ThinkPHP頁面靜態功能實現(一)

頁面靜態化有很多好處,加快頁面開啟瀏覽速度,有利於搜尋引擎優化SEO,減輕伺服器負擔,網站更安全,HTML頁面不會受php相關漏洞的影響。常說的頁面靜態化分為兩種,一種是偽靜態,即url 重寫,一種是真靜態化。 ThinkPHP 也自帶了生成靜態檔案的方法 buildHtm

ThinkPHP頁面靜態功能實現(二)

常說的頁面靜態化分為兩種,一種是偽靜態,即url 重寫,一種是真靜態化。 上一篇講到了ThinkPHP自帶的buildHtml()方法生成靜態頁面,在ThinkPHP的官方文件也沒具體講到此方法,而文件卻很具體的講了靜態快取技術,看來TP官方還是建議使用靜態快取。 一. 網

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

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

HTML頁面靜態實現

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

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

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

Django2.0.3如何實現頁面靜態

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

Asp.net 靜態思路第實現

做頁面靜態化 網上經常提到的有兩種 1、模板頁+替換的方式 2、偽靜態化,地址重寫   現在我想採用第三種方式,基於網頁抓取技術實現(參考)   1、建立實現類 public class MyUri : System.Uri {

ASP.NET 路由實現頁面靜態

頁面靜態化最大的好處是利於SEO,即使是偽靜態,搜尋引擎也會覺得這是一個較為友好的Url。Url的友好也取決於其命名,為一篇描述古代文學的頁面起名用ancient-literature.html當然比隨便起的名字例如aa.html之流要友好。頁面靜態化並不代表你一定要用字尾

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

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

使用ob快取簡單實現頁面靜態

<?php //接收新聞id,傳統的方法查詢資料庫並顯示資料 $id=intval($_GET['id']); //先判斷該新聞對於的靜態頁面是否存在,如果有,則直接返回,如果 //沒

php實現頁面靜態(純靜態&&偽靜態

1、開啟buffer •在php.ini中的output_buffering開啟 •在php檔案中應用ob_start()函式開啟 ; Default Value: Off ; Development Value: 4096 ; Production Value: 4

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

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

Jquery 頁面初始常用的種方法以及Jquery 發送ajax 請求

tree error 渲染 erro 發生 har 初始化 nload 事情 第一種 $(document).ready(function(){ //文檔就緒事件 }); 第二種是第一種的簡略寫法,效果上和第一種是等效的。 $(function(){ //文檔加載事

ASP.NET MVC頁面搜索功能實現(普通方法和使用Ajax)

ati isn 數據過濾 valid ren 輸入框 普通 分部視圖 添加 使用以下方法可以對數據進行過濾再在頁面中顯示 假設當前數據庫、控制器和視圖都已創建 模型名為Movies 控制名為MoviesController 顯示頁面的視圖名為Index 數據庫上下文為Mo

Freemarker頁面靜態技術

view color 分享圖片 doctype nbsp fig ces 取數據 doc 初步理解: 架構優化: 靜態頁面的訪問速度優於從緩存獲取數據的動態頁面的訪問速度; Freemarker: 導包 模板:hello.ftl 1 <!DOCTYPE

頁面靜態常用方法

nosql blank tail 操作 memcache body www 內容 ali 頁面靜態化常用方法 常說的頁面靜態化分為兩種,一種是偽靜態,即url 重寫,一種是真靜態化。我們以真靜態化為主來講講。 什麽是PHP靜態化 PHP靜態化的簡單理解就是使網站生成頁

asp.net 頁面靜態

mage 表示 file har utf 做的 PC src AR 頁面靜態化,有三種方式 偽靜態 真靜態,折中法 現在我做的是折中發 創建一個asp.net 頁面, 連接跳轉到還未生成的頁面 創建HttpHandle類 using Sys

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

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

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

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