入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

ThinkPHP 的页面静态化功能的实现(二)

创建时间:2017-02-10 投稿人: 浏览次数:5447

常说的页面静态化分为两种,一种是伪静态,即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/目录下了。 阅读更多
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。