ThinkPHP生成静态缓存页面

静态缓存技术(此处不讲ThinkPHP的buildHtml()方法生成静态页面):
一. 网站只有一套模板
(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(    	// 定义静态缓存规则
	 //静态缓存有效期如果不定义,则会获取上面设置的值,如果定义为0则表示永久缓存。
	'Login:reg'   => array('{:controller}/{:action}'),
	'Login:login'   => array('{:controller}/{:action}'),
	'Login:forget'   => array('{:controller}/{:action}'),
	'Login:user_info'   => array('{:controller}/{:action}'),
	'Login:gaimi'   => array('{:controller}/{:action}'),
	'Index:index'   => array('{:controller}/{:action}'),
	'Index:article'   => array('{:controller}/{:action}/{wid}_{p}_list'),	//wid要与数据库表对应字段一致
	'Index:info'   => array('{:controller}/{:action}/{wid}'),				//wid要与数据库表对应字段一致
	'Index:notice'   => array('{:controller}/{:action}/{typeid}_{p}_list'),	//typeid要与数据库表对应字段一致
	'Index:notice_info'   => array('{:controller}/{:action}/{nid}'),		//nid要与数据库表对应字段一致
	'Index:fatie'   => array('{:controller}/{:action}'),
	'Index:contact'   => array('{:controller}/{:action}'),
	'Index:music'   => array('{:controller}/{:action}/{id}_{p}_list'),
	'Index:photo'   => array('{:controller}/{:action}/{id}_{p}_list'),
)

{:module} 表示当前模块名、{:controller} 表示控制器名、{:action} 表示操作名,{id} 与 {$_GET.id}相同,{p}表示页数。如果有"/",则会自动创建目录。
如图:


在这里插入图片描述

首次访问时,会在前面设置的静态文件生成位置目录按指定的格式生成静态html文件。如图:

在这里插入图片描述
在这里插入图片描述

此时打开网站访问到的就是静态页面。

但是如果网站有PC和移动端两套模板,那么这样生成的静态页面只有一套,手机先访问就生成手机模板,再用电脑访问就会混乱。
二. 网站有PC和移动端两套模板
(1)在根目录下的入口文件index.php中进行如下配置:

define('HTML_PATH', './HTML/');		//生成静态页面的文件位置

(2)模板中添加以下判断代码:

//如果是手机访问,设置手机缓存目录
if(isMobile()){
	$_SESSION['cache_path'] = 'mobile/';
}else if(isset($_SESSION['cache_path'])){
	unset($_SESSION['cache_path']);    
}
//判断是否是移动端访问
function isMobile(){ 
    // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
    if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])){
        return true;
    }
    // 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
    if (isset ($_SERVER['HTTP_VIA'])){
        return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;
    } 
    // 判断手机发送的客户端标志
    if (isset ($_SERVER['HTTP_USER_AGENT'])) {
        $clientkeywords = array (
            'mobile',
            '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'
            ); 
        // 从HTTP_USER_AGENT中查找手机浏览器的关键字
        if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT']))){
            return true;
        }
    }
    if (isset ($_SERVER['HTTP_ACCEPT'])){ // 协议法,因为有可能不准确,放到最后判断
        // 如果支持wml且不支持html,或者支持wml和html但wml在html之前,则是移动设备。
        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;
}

(3)在前台项目配置文件config.php中进行如下配置:

//设置静态缓存
'HTML_CACHE_ON'   => true,     	// 开启静态缓存
'HTML_CACHE_TIME' => 604800,   	// 全局静态缓存有效期(秒)(3600*24*7)
'HTML_FILE_SUFFIX'=> '.html',  	// 设置静态缓存文件后缀
'HTML_CACHE_RULES'=> array(    	// 定义静态缓存规则
	'Login:reg'   => array('{$_SESSION.cache_path}/{:controller}/{:action}'),
	'Login:login'   => array('{$_SESSION.cache_path}/{:controller}/{:action}'),
	'Login:forget'   => array('{$_SESSION.cache_path}/{:controller}/{:action}'),
	'Login:user_info'   => array('{$_SESSION.cache_path}/{:controller}/{:action}'),
	'Login:gaimi'   => array('{$_SESSION.cache_path}/{:controller}/{:action}'),
	'Index:index'   => array('{$_SESSION.cache_path}/{:controller}/{:action}'),
	'Index:article'   => array('{$_SESSION.cache_path}/{:controller}/{:action}/{wid}_{p}_list'),	//wid要与数据库表对应字段一致
	'Index:info'   => array('{$_SESSION.cache_path}/{:controller}/{:action}/{wid}'),				//wid要与数据库表对应字段一致
	'Index:notice'   => array('{$_SESSION.cache_path}/{:controller}/{:action}/{typeid}_{p}_list'),	//typeid要与数据库表对应字段一致
	'Index:notice_info'   => array('{$_SESSION.cache_path}/{:controller}/{:action}/{nid}'),			//nid要与数据库表对应字段一致
	'Index:fatie'   => array('{$_SESSION.cache_path}/{:controller}/{:action}'),
	'Index:contact'   => array('{$_SESSION.cache_path}/{:controller}/{:action}'),
	'Index:music'   => array('{$_SESSION.cache_path}/{:controller}/{:action}/{id}_{p}_list'),
	'Index:photo'   => array('{$_SESSION.cache_path}/{:controller}/{:action}/{id}_{p}_list'),
)

移动端先访问时,会先生成一个名为cache_path、内容为mobile/的字符串缓存,然后在HTML/mobile/目录下生成移动端静态文件;如果再用PC端访问,会先清除名为cache_path的字符串缓存内容,再在HTML/目录下生成静态文件。

注意:后台更新内容后必须删除已存在的静态文件,否则前台打开不能实时显示更新的内容。

猜你喜欢

转载自blog.csdn.net/qq_38882327/article/details/88952464
今日推荐