zoukankan      html  css  js  c++  java
  • ThinkPhp数据缓存技术

    1.缓存初始化

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

    而我们使用的时候,并不需要直接声明它,直接使用一个大 S()方法即可

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

    // 缓存初始化
    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']);

      

  • 相关阅读:
    【转】win8.1下安装ubuntu
    Codeforces 1025G Company Acquisitions (概率期望)
    Codeforces 997D Cycles in Product (点分治、DP计数)
    Codeforces 997E Good Subsegments (线段树)
    Codeforces 1188E Problem from Red Panda (计数)
    Codeforces 1284E New Year and Castle Building (计算几何)
    Codeforces 1322D Reality Show (DP)
    AtCoder AGC043C Giant Graph (图论、SG函数、FWT)
    Codeforces 1305F Kuroni and the Punishment (随机化)
    AtCoder AGC022E Median Replace (字符串、自动机、贪心、计数)
  • 原文地址:https://www.cnblogs.com/jingmin/p/6388181.html
Copyright © 2011-2022 走看看