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

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM