ThinkPhp数据缓存技术

1.缓存初始化php

在 ThinkPHP 中,有一个专门处理缓存的类:Cache.class.php(在Thinkphp/Library/Think/cache.class.php,其余的各类缓存类也在这个文件夹下)。html

而咱们使用的时候,并不须要直接声明它,直接使用一个大 S()方法便可数据库

ThinkPhp系统内置对缓存操做进行了封装,直接采用S方法。windows

// 缓存初始化
S(array('type'=>'xcache','expire'=>60));

缓存初始化,要指明缓存类型和缓存时间。数组

  1.1缓存类型缓存

  ThinkPhp系统目前已经支持的缓存类型包括:Apachenote、Apc、Db、Eaccelerator、File、Memcache、Redis、Shmop、Sqlite、Wincache和Xcache安全

    1.1.1不一样的缓存类型以及参数服务器

    ①Apachenote:host 缓存服务器地址( 默认为127.0.0.1)框架

    ②Apc:函数

        APC缓存扩展,windows下面为php_apc.dll,须要先加载这个模块,而后是在php.ini里面进行配置:
       [apc] extension=php_apc.dll apc.rfc1867 = on upload_max_filesize = 100M
       post_max_size = 100M apc.max_file_size = 200M upload_max_filesize =
       1000M post_max_size = 1000M max_execution_time = 600 ;
       每一个PHP页面运行的最大时间值(秒),默认30秒 max_input_time = 600 ; 每一个PHP页面接收数据所需的最

       大时间,默认60
       memory_limit = 128M ; 每一个PHP页面所吃掉的最大内存,默认8M

 

    ③Db:db 数据库名称(默认由DB_NAME参数配置) 
       table 数据表名称(默认由DATA_CACHE_TABLE参数配置)

    ④Eaccelerator:

      原理

eAccelerator 经过把通过编译后的PHP代码缓存到共享内存中,并在用户访问的时候直接调用从而起到高效的加速做用。它的效率很是高,从建立共享内存到查找编译后的代码 都在很是短的时间内完成,对于不能缓存到共享内存中的文件和代码,eAccelerator还能够把他们缓存到系统磁盘上。

 

eAccelerator 一样还支持PHP代码的编译和解释执行,你能够经过encoder.php脚原本对php代码进行编译达到保护代码的目的,通过编译后的代码必须运行在安 装了eAccelerator的环境下。eAccelerator编译后的代码不能被反编译,它不象其余一些编译工具那样能够进行反编译,这将使得代码更 加安全和高效。

具体的暂时先参考:https://my.oschina.net/angelangel/blog/338458,待我整理了,给你们呈现。

 

    ⑤File:temp 缓存目录(默认由DATA_CACHE_PATH参数配置)

    ⑥Memcache:

    缓存初始化参数配置:

S(array(  
  'type'=>'memcache',    //类型
  'host'=>'192.168.1.10',   //服务器地址
 'port'=>'11211',       //服务器端口
 'prefix'=>'think',     //缓存标示前缀
 'expire'=>60)      //缓存有效时间
);

            host 缓存服务器地址( 默认为127.0.0.1) 
      port 端口(默认为MEMCACHE_PORT参数或者11211) 
      timeout 缓存超时(默认由DATA_CACHE_TIME参数设置) 
      persistent 长链接(默认为false)

 

    ⑦Redis:host 服务器地址(默认由REDIS_HOST参数配置或者127.0.0.1) 
        port端口(默认由REDIS_PORT参数配置或者6379) 
        timeout 超时时间(默认由DATA_CACHE_TIME配置或者false) 
        persistent长链接(默认为false)

    ⑧Shmop:size(默认由SHARE_MEM_SIZE参数设置) 
         tmp(默认为TEMP_PATH) 
         project (默认为s) 
         length 缓存队列长度(默认为0)

    ⑨Sqlite:db 数据库名称(默认:memory:) 
        table 表名(默认为sharedmemory) 
        persistent 长链接(默认为false)

    ⑩Wincache:

    ①①Xcache:

  

  ThinkPhp既然有不一样的缓存类型,那么TP的缓存初始化能够支持的参数根据不一样的缓存方式是有所区别的,经常使用的参数有

参数 做用
expire 缓存有效期(时间为秒)
prefix 缓存标识前缀
type 缓存类型

  

    若是S方法不传入type参数初始化的话,则读取配置文件中设置的DATA_CACHE_TYPE参数值做为默认类型。一样的道理,prefix参数若是没有传入会读取配置文件的DATA_CACHE_PREFIX参数值,expire参数没有传入则读取DATA_CACHE_TIME配置值做为默认。

 

2.缓存设置

  

// 设置缓存
S('a',$value);

 

 

 

 

  咱们的TP会按照缓存初始化时候的参数进行缓存数据,咱们也能够在缓存设置的时候改变参数

// 缓存数据300秒
S('a',$value,300);

 

 

3.缓存读取

 

// 读取缓存
$value = S('a');

 

缓存读取的是前面缓存设置的值,这个值会受缓存初始化或者缓存设置的时候传入的参数影响。 若是缓存标识不存在或者已通过期,则返回false,不然返回缓存值。

 

4.删除缓存

 

// 删除缓存
S('a',null);

 

删除缓存标识为name的缓存数据。

 

5.对象方式操做缓存

 

// 初始化缓存
$cache = S(
array( 'type'=>'xcache', 'prefix'=>'think', 'expire'=>600)
);
$cache->name = 'value'; // 设置缓存 $value = $cache->name; // 获取缓存 unset($cache->name); // 删除缓存

 

 

 

 

 

6.缓存队列

 

S(array(
'type'=>'xcache', //缓存类型
'length'=>100,    //限制的缓存数量
'expire'=>60));   //有效缓存时间

 设置限制缓存数量,系统只会缓存最近的100条缓存数据。

 

 

7.快速缓存

若是咱们没有设置expire参数,系统还提供了一个快速缓存方法F能够用来更快的操做

•F方法能够支持不一样的存储类型,若是是文件类型的话,默认保存在DATA_PATH目录下面。

  

  7.1快速缓存Data数据

F('data',$Data);

 

  7.2快速缓存Data数据,保存到指定的目录

 

F('data',$Data,TEMP_PATH);

 

  7.3获取缓存数据

 

$Data = F('data');

 

  7.4删除缓存数据

F('data',NULL);

  7.5F方法支持自动建立缓存子目录,在DATA_PATH目录下面缓存data数据,若是User子目录不存在,则自动建立:

 

F('User/data',$Data);

 

  

8.查询缓存

  进行查询缓存的缘由:对于及时性要求不高的数据查询,咱们能够使用查询缓存功能来提升性能,并且无需本身使用缓存方法进行缓存和获取。

 
  在使用查询缓存的时候,只须要调用Model类的cache方法。
$Model->cache(true)->where('status=1')->select();

  若是使用了cache(true) ,则在查询的同时会根据当前的查询条件等信息生成一个带有惟一标识的查询缓存,若是指定了key的话,则直接生成名称为key的查询缓存 :

$Model->cache('cache_name')->select();

  •指定key的方式会让查询缓存更加高效。

 

  •默认状况下缓存方式采用DATA_CACHE_TYPE参数设置的缓存方式(系统默认值为File表示采用文件方式缓存),缓存有效期是DATA_CACHE_TIME参数设置的时间,也能够单独制定查询缓存的缓存方式和有效期:

$Model->cache(true,60,'xcache')->select();
//缓存方式为xcache,而且缓存有效期为60秒

  

  •若是指定了查询缓存的key的话,则能够在外部经过S方法直接获取查询缓存的内容

$value = S('cache_name');

  

  select方法以外,查询缓存还支持find和getField方法,以及他们的衍生方法

// 对查询数据缓存60秒
$Model->where($map)->cache('key',60)->find();

 

9.SQL解析缓存

  使用SQL解析缓存的缘由:若是咱们的应用有大量的SQL查询需求,那么能够开启SQL解析缓存以减小SQL解析提升性能。

  •只有查询方法才支持SQL解析缓存

 

    开启SQL解析缓存(默认缓存方式为文件方式):

'DB_SQL_BUILD_CACHE' => true

 

      SQL缓存还支持xcache和apc方式缓存,设置方式:

'DB_SQL_BUILD_QUEUE' => 'xcache',
'DB_SQL_BUILD_QUEUE' => 'apc',

 

  一个项目的查询SQL的量可能会很是巨大,因此有必要设置下缓存的队列长度,设置方式:

 

'DB_SQL_BUILD_LENGTH' => 20, // SQL缓存的队列长度

 

 

10.静态缓存

  要使用静态缓存功能,须要开启HTML_CACHE_ON参数,而且使用HTML_CACHE_RULES配置参数设置静态缓存规则文件 。

 

    

    10.1静态规则定义

  定义方式:
'HTML_CACHE_ON'     =>    true, // 开启静态缓存
'HTML_CACHE_TIME'   =>    60,   // 全局静态缓存有效期(秒)
'HTML_FILE_SUFFIX'  =>    '.shtml', // 设置静态缓存文件后缀'
HTML_CACHE_RULES'  =>     array(  // 定义静态缓存规则     
// 定义格式1 数组方式    
 '静态地址'    =>     array('静态规则', '有效期', '附加规则'),     
 // 定义格式2 字符串方式     '静态地址'    =>     '静态规则', 
)

  定义格式1采用数组方式 便于单独为某个静态规则设置不一样的有效期,

  定义格式2采用字符串方式订阅静态规则,同时采用HTML_CACHE_TIME设置的全局静态缓存有效期。

  •静态缓存文件的根目录在HTML_PATH定义的路径下面,而且只有定义了静态规则的操做才会进行静态缓存。 而且静态缓存支持不一样的存储类型。 静态缓存仅在GET请求下面有效。

 

  10.2静态地址

    静态地址定义格式:

    ①.定义全局的操做静态规则

 

'read'=>array('{id}',60)  //定义全部的read操做的静态规则

     {id} 表示取$_GET['id'] 为静态缓存文件名,第二个参数表示缓存60秒      

     

     ②.定义全局的控制器静态规则

 

'user:'=>array('User/{:action}_{id}','600')   //定义全部的User控制器的静态规则

 

     {:action} 表示当前的操做名称

 

     ③定义某个控制器的操做的静态规则

 

'blog:read'=>array('{id}',0)  //定义Blog控制器的read操做进行静态缓存

 

     

     ④定义全局的静态缓存规则

 

'*'=>array('{$_SERVER.REQUEST_URI|md5}'),  //任何模块的操做都适用

 

     表示根据当前的URL进行缓存

 

 

  10.3静态规则

  静态规则是用于定义要生成的静态文件的名称,静态规则的定义要确保不会冲突

  

    10.3.1使用系统变量

   包括 _GET_REQUEST_SERVER_SESSION_COOKIE 格式:

{$_×××|function}

{$_GET.name}

{$_SERVER.REQUEST_URI|md5}

 

    10.3.2使用框架特定的变量

 

    {:module}{:controller}{:action} 分别表示当前模块名、控制器名和操做名。

{:module}/{:controller}_{:action}

    

    10.3.3使用_GET变量

   {var|function}也就是说 {id} 其实等效于 {$_GET.id}

 

   10.3.4直接使用函数{|function}

{|time}

    

    10.3.5支持混合定义

    例:定义一个静态规则

'{id},{name|md5}' 

      

    在{}以外的字符做为字符串对待,若是包含有"/",会自动建立目录。

{:module}/{:action}_{id}

    则会在静态目录下面建立模块名称的子目录,而后写入操做名_id.shtml 文件。

 

   10.4静态缓存有效期

   单位为秒。若是不定义,则会获取配置参数HTML_CACHE_TIME 的设置值,若是定义为0则表示永久缓存。

 

    10.5附加规则

    对静态规则进行函数运算

'read'=>array('Think{id},{name}','60', 'md5') 

     翻译后的静态规则是 md5('Think'.$_GET['id']. ', '.$_GET['name']);

相关文章
相关标签/搜索