使用ThinkPHP有一段时间了,没注意tp有静态缓存的功能,一直是自己手写的静态生成代码,但是有诸多问题,比如推荐商品的更新、商品库存变动、商品描述改动、模板文件改动等。。。
后来尝试过使用ajax加载需要经常更新和变动的内容,但是这样页面源代码里面没有异步加载的内容,都优化很不利,搜索引擎不会执行js代码和ajax请求。
ThinkPH内置了静态缓存的功能,但是需要对其进行一些改装
要使用静态缓存功能,需要开启HTML_CACHE_ON 参数,并且使用HTML_CACHE_RULES配置参数设置静态缓存规则文件 。
ThinkPHP中静态规则的定义方式如下:
'HTML_CACHE_ON'=>true,
'HTML_CACHE_RULES'=> array(
'ActionName' => array('静态规则', '静态缓存有效期', '附加规则'),
'ModuleName(小写)' => array('静态规则', '静态缓存有效期', '附加规则'),
'ModuleName(小写):ActionName' => array('静态规则', '静态缓存有效期', '附加规则'),
'*' => array('静态规则', '静态缓存有效期', '附加规则'),
//…更多操作的静态规则
)
我的系统里商品详情页的访问URL如下(假设商品id是1,域名是abc.com):
http://www.abc.com/Goods/show/id/1.html (PC动态)
http://m.abc.com/Goods/show/id/1.html(手机动态)
http://www.abc.com/item/1.html (PC静态)
http://m.abc.com/item/1.html(手机静态)
首先在GoodsAction继承的CommonAction的初始化函数_initialize()中加入域名访问控制策略函数checkRedirect(),如下:
function checkRedirect(){
if(file_exists(TMPL_PATH.MODULE_NAME."/".ACTION_NAME.".html")){
//手机上打开pc域名且m页面存在,跳转手机m域名
if(isMobile() && !isMDomain() && file_exists(TMPL_PATH.MODULE_NAME."/".ACTION_NAME."_m.html")){
header("Location: ".C('SITE_URL_MOBILE').$_SERVER['PHP_SELF']);
}
//访问m域名且m页面不存在,跳转pc域名
if(isMDomain() && !file_exists(TMPL_PATH.MODULE_NAME."/".ACTION_NAME."_m.html")){
header("Location: ".C('SITE_URL').$_SERVER['PHP_SELF']);
}
}
}
function isMDomain(){
return ($_SERVER['HTTP_HOST']==substr(C('SITE_URL_MOBILE'),7));
}
pc端模板页面文件跟ACTION_NAME保持一致,手机端模板页面文件在ACTION_NAME后面加_m。
此函数将判断用户使用的域名和系统是否存在相应的模板文件。
注意以下两种情况:
1、当用户使用手机访问PC页面,但是系统存在对应的手机版页面时,系统会自动跳转到对应的手机版页面
2、当用户访问的是手机页面(无论何种设备),但是当前手机版页面不存在时,系统自动跳转到对应PC版页面