缓存处理
一. 数据缓存
在 ThinkPHP 中,有一个专门处理缓存的类:Cache.class.php。而我们使用的时候,
并不需要直接声明它,直接使用一个大 S()方法即可。
系统目前已经支持的缓存类型包括:Apachenote、Apc、Db、Eaccelerator、File、
Memcache、Redis、Shmop、Sqlite、Wincache 和 Xcache。如果不初始化,会默认使用
File 文件缓存。
初始化的方法为:
1 S( array( 2 'type'=>'memcache', 3 'host'=>'127.0.0.1', 4 'port'=>'11211', 5 'prefix'=>'think', 6 'expire'=>60 7 ));
PS:如果不初始化的化,将使用默认配置使用。
type 的默认设置为: C('DATA_CACHE_TYPE'); //File
prefix 的默认设置为: C('DATA_CACHE_PREFIX'); //无
expire 的默认设置为: C('DATA_CACHE_TIME'); //0
其他参数,如果没设置,将没有值。
在 WeiBo/Home/Controller/UserController.class.php 中的代码为:
1 namespace Home\Controller; 2 use Think\Controller; 3 4 class UserController extends Controller { 5 public function index() { 6 if(!$list=S('list')) 7 { 8 $user = D('User'); 9 $list = $user->select(); 10 S('list',$list,10); 11 } 12 $this->assign('list',$list); 13 $this->display(); 14 } 15 }
S('list',$list,10); 就是将数据库中获得的数组 $list 的数据换存在 S('list') 中,10秒之后进行更新
if(!$list=S('list')) 是判断当获得的数组是否缓存在 S('list') 中,不在的话就获取数据在进行缓存
比如该代码进行第一次获取后台数据库数据时会有SQL语句进行获取,之后在10秒以内,再刷新的话,则不会在对数据库进行查询了。
1 //删除缓存 2 S('list', null);
二. 快速缓存
如果不想设置有效期存储,可以使用大 F()方法的快速缓存。
1 //使用F()方法快速缓存 2 public function index() { 3 if (!$list = F('list')) { 4 $user = D('User'); 5 $list = $user->select(); 6 F('list', $list, TEMP_PATH); 7 } 8 $this->assign('list', $list); 9 $this->display(); 10 }
其中 F('list', $list, TEMP_PATH); 中的 TEMP_PATH 是将路径设为
默认是在
1 //删除缓存 2 F('list', null);
三.查询缓存
对于及时性要求不高的数据查询,我们可以使用查询缓存功能来提高性能。
1 //查询SQL后缓存 2 $list = $user->cache( true)->select();
在 WeiBo/Home/Controller/UserController.class.php 中代码样式为:
1 public function index() { 2 $user = D('User'); 3 $list = $user->cache(true)->select(); 4 $this->assign('list', $list); 5 $this->display(); 6 }
1 //指定缓存的Key会更加高效 2 $list = $user->cache('cache_user')->select();
1 //可以设定过期时间和其他缓存方式 2 $list = $user->cache('cache_user', 10, 'xcache')->select();
PS:如果没有安装 xcache 缓存,则会报错。而过期时间,必须关闭调试模式方可有效。
这里的缓存方式可以设置为:
Apachenote、Apc、Db、Eaccelerator、File、 Memcache、Redis、Shmop、Sqlite、Wincache 和 Xcache
中任何一种。
1 //获取缓存 2 var_dump(S('cache_user'));
1 //删除缓存 2 S('cache_user', null);
除了查询缓存之外,对于 SQL 查询语句本身也有解析缓存,就是把 SQL 语句给缓存下
来,下次执行就不需要再解析了。当然,如果使用了查询缓存本身,由于已经将内容缓存,
所以解析缓存基本上用的较少。
1 //SQL解析缓存 2 'DB_SQL_BUILD_CACHE' => true,
四. 静态缓存
所谓静态缓存,就是第一次访问 PHP 时生成一个纯静态文件。当第二次访问时,就直
接访问这个静态文件。特别适合类似于 CMS 系统这种页面状态变化较少的程序。
在 WeiBo/Common/Conf/config.php 中进行配置:
1 //开启静态缓存 2 'HTML_CACHE_ON'=> true,
1 //全局缓存时间60秒 2 'HTML_CACHE_TIME'=>60,
1 //缓存的后缀 2 'HTML_FILE_SUFFIX'=>'.html',
//缓存规则 'HTML_CACHE_RULES'=> array( //控制器:方法 //模块_控制器_方法_ID,局部60秒 'User:index'=> array('{:module}_{:controller}_{:action}_{id}',60), ),
配置好上述四条后,在WeiBo目录下会多出一个Html文件,这里存放的就是缓存文件
这时的url为 http://localhost/demo39/index.php/User/index/id/5 最后的 id/5 是平添上去的,没有任何意义,
这时在Html文件夹下生成一个名为 Home_User_index_5.html 的缓存文件
是按照配置中 {:module}_{:controller}_{:action}_{id} 的形式生成的,
如果该配置中的_全部改成/,则生成的形式为:
这时的缓存文件为5.html
除了上面的缓存规则,还有其他的缓存规格选择:
1 //方法名 2 'index'=> array('{id}', 60),
1 //控制器: //User目录下的 方法_ID 2 'User:'=> array('User/{:action}_{id}', 60),
1 //控制器名:方法名 2 'User:index'=> array('{id}', 60),
1 //将当前地址加密作为文件名 2 '*'=> array('{$_SERVER.REQUEST_URI|md5}'),