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']);

相關文章
相關標籤/搜索