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

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

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

上一篇講到了ThinkPHP自帶的buildHtml()方法生成靜態頁面,在ThinkPHP的官方文件也沒具體講到此方法,而文件卻很具體的講了靜態快取技術,看來TP官方還是建議使用靜態快取

一. 網站不分手機版和電腦版,只有一套前臺模板

(1)在根目錄下的程式入口檔案index.php中加下面這行:

define('HTML_PATH', './HTML/');//生成靜態頁面的檔案位置

(2)在專案的配置檔案config.php中進行如下配置:
'HTML_CACHE_ON'   => true,     // 開啟靜態快取
'HTML_CACHE_TIME' => 604800,   // 全域性靜態快取有效期(秒)(3600*24*7)
'HTML_FILE_SUFFIX'=> '.html',  // 設定靜態快取檔案字尾
'HTML_CACHE_RULES'=> array(    // 定義靜態快取規則
	 // 定義格式1 陣列方式
	 // 定義格式2 字串方式
	 //後一個引數是靜態快取有效期,單位為秒。如果不定義,則會獲取配置引數HTML_CACHE_TIME 的設定值,如果定義為0則表示永久快取。
	 'Index:index'    =>array('{:controller}_{:action}'),
	 'Index:articalList'    =>array('{:controller}_{:action}/{id}_{p}_list'),
	 'Index:articalInfo'    =>array('{:controller}_{:action}/{id}'),
	 'Index:productList'    =>array('{:controller}_{:action}/{id}_{p}_list'),
	 'Index:productInfo'    =>array('{:controller}_{:action}/{id}'),
	 //'Index:staticcachec'    =>array('{:module}/{:controller}/{:action}/{id}',30),
	 //'Index:staticcachec'    =>array('{:module}/{:controller}/{:action}_{id}',30),
)
{:module} 、{:controller} 和{:action} 分別表示當前模組名、控制器名和操作名,{id} 其實等效於 {$_GET.id},{p}則表示分頁。在{}之外的字元作為字串對待,如果包含有"/",會自動建立目錄。

在前臺第一次訪問某個模組的某個控制器的某個方法時,就會在指定的目錄按照指定的檔名格式生成靜態HTML檔案。如圖:


此時訪問網站雖然URL沒有變,但訪問到的就是靜態化之後的頁面。親測有效,但是此法也有不足:

如果系統分電腦版和手機版兩套模板,那麼生成的靜態頁面只有一套,手機先訪問就生成手機的模板,再用電腦訪問的介面就會混亂。

但如若網站只有一套模板(比如電腦版)那麼到此就夠了。如果手機電腦兩套模板,解決方法如下

二. 網站分手機版和電腦版兩套模板

(1)在根目錄下的程式入口檔案index.php中進行如下配置:

define('HTML_PATH', './HTML/');//生成靜態頁面的檔案位置

//如果是手機訪問,設定手機快取目錄
if(isMobile()){
	$_SESSION['theme_path'] = 'mobile/';
}elseif(isset($_SESSION['theme_path'])){
	unset($_SESSION['theme_path']);    
}

//判斷是否是手機訪問
function isMobile(){
    if(isset($_SERVER['HTTP_X_WAP_PROFILE'])) return true;
    if(isset($_SERVER['HTTP_VIA']))return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
    if(isset($_SERVER['HTTP_USER_AGENT'])){$clientkeywords = array ('nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile');if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT'])))return true;}
    if(isset($_SERVER['HTTP_ACCEPT'])){if((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html'))))return true;} 
    return false;
 }

(2)在專案的配置檔案config.php中進行如下配置:
//設定靜態快取
'HTML_CACHE_ON'   => true,     // 開啟靜態快取
'HTML_CACHE_TIME' => 604800,   // 全域性靜態快取有效期(秒)(3600*24*7)
'HTML_FILE_SUFFIX'=> '.html',  // 設定靜態快取檔案字尾
'HTML_CACHE_RULES'=> array(    // 定義靜態快取規則
	 // 定義格式2 字串方式
	 'Index:index'    =>array('{$_SESSION.theme_path}/{:controller}_{:action}'),
	 'Index:articalList'    =>array('{$_SESSION.theme_path}/{:controller}_{:action}/{id}_{p}_list'),
	 'Index:articalInfo'    =>array('{$_SESSION.theme_path}/{:controller}_{:action}/{id}'),
	 //'Index:productList'    =>array('{$_SESSION.theme_path}/{:controller}_{:action}/{id}_{p}_list'),
	 //'Index:productInfo'    =>array('{$_SESSION.theme_path}/{:controller}_{:action}/{id}'),
)

那麼手機訪問的時候,會先以快取的方式生成一個名字為theme_path內容為mobile/的字串快取,然後在HTML/mobile/目錄下生成相應的手機模板靜態檔案;如果再用電腦訪問,那麼會先清除名字為theme_path的字串快取內容,那麼再生成靜態檔案的時候就在HTML/目錄下了。