thinkphp有哪些緩存類型

thinkphp有哪些緩存類型

thinkphp提供了方便的緩存方式,包括數據緩存、靜態緩存和查詢緩存等,支持包括文件方式、APC、Db、Memcache、Shmop、Sqlite、Redis、Eaccelerator和Xcache在內的動態數據緩存類型,以及可定制的靜態緩存規則,并提供了快捷方法進行存取操作。

數據緩存

Thinkphp緩存文件的配置

Home是我建立的前臺項目,在HomeConfconfig.php找到緩存的配置文件,配置如下:

立即學習PHP免費學習筆記(深入)”;

<?php        return array(           &#39;DB_TYPE&#39;=>'mysql',??????? ???'DB_HOST'=&gt;'127.0.0.1',??????? ??'DB_NAME'=&gt;'w3note',??????? ???'DB_USER'=&gt;'root',??????? ??'DB_PWD'=&gt;'123456',??????? ??'DB_PORT'=&gt;'3306',??????? ??'DB_PREFIX'=&gt;'w3_',??????? ??'DATA_CACHE_TYPE'=&gt;'file',//設置緩存方式為file??????? ??'DATA_CACHE_TIME'=&gt;'600',//緩存周期600秒??????? ?);??????? ??&gt;

Thinkphp緩存函數的使用

thinkphp中,使用快捷緩存函數S()進行緩存,其用法如下:

S('data',$Data);//使用data標識緩存$Data數據?? S('data',$Data,600);//?緩存$Data數據600秒?? ?$Data?=?S('data');//?獲取緩存數據?? S('data',NULL);//?刪除緩存數據

實例演示

<?php          // 本類由系統自動生成,僅供測試用途          class IndexAction extends Action{            public function index(){                //如果有緩存,則讀取緩存數據                //如果沒有緩存,則讀取數據庫當中的數據放入緩存                $lists=S(&#39;lists&#39;);                              if(emptyempty($lists)){                                      $news=M(&#39;news&#39;);              $lists=$news->select();??? ??????????S('lists',$lists,600);??? ??????????echo?'這是直接讀取數據庫的數據';??????? ???????????}??? ????????dump($list);?? ??&gt;

訪問http://127.0.0.1/Home/index.php/Index/index,

第一次訪問:

這是直接讀取數據庫的數據

array(10)?{?? ???[0]?=&gt;?array(12)?{?? ?????["id"]?=&gt;?string(1)?"1"?? ?????["catid"]?=&gt;?string(2)?"13"?? ?????["title"]?=&gt;?string(4)?"thinkphp的緩存技術"?? ?????["content"]?=&gt;?string(8)?"thinkphp的緩存技術"?? ?????["tags"]?=&gt;?string(4)?"緩存"?? ?????["thumb"]?=&gt;?string(0)?""?? ?????["description"]?=&gt;?string(7)?"thinkphp的緩存技術"?? ?????["inputtime"]?=&gt;?string(10)?"1348370202"?? ?????["posid"]?=&gt;?string(1)?"1"?? ?????["ord"]?=&gt;?string(1)?"2"?? ?????["hits"]?=&gt;?string(1)?"1"?? ?????["status"]?=&gt;?string(1)?"1"?? ?}

第二次訪問:

array(10)?{?? ???[0]?=&gt;?array(12)?{?? ?????["id"]?=&gt;?string(1)?"1"?? ?????["catid"]?=&gt;?string(2)?"13"?? ?????["title"]?=&gt;?string(4)?"thinkphp的緩存技術"?? ?????["content"]?=&gt;?string(8)?"thinkphp的緩存技術"?? ?????["tags"]?=&gt;?string(4)?"緩存"?? ?????["thumb"]?=&gt;?string(0)?""?? ?????["description"]?=&gt;?string(7)?"thinkphp的緩存技術"?? ?????["inputtime"]?=&gt;?string(10)?"1348370202"?? ?????["posid"]?=&gt;?string(1)?"1"?? ?????["ord"]?=&gt;?string(1)?"2"?? ?????["hits"]?=&gt;?string(1)?"1"?? ?????["status"]?=&gt;?string(1)?"1"?? ?}

說明:第一次運行時,會打印出如上面所示信息,刷新一下頁面后,少了 “ 這是直接讀取數據庫的數據” ,說明讀取的是先前生成的緩存數據。

相關推薦:《ThinkPHP教程

快速緩存

如果你僅僅是希望用文件的方式緩存一些簡單的數據,并且沒有有效期的概念,那么系統還提供了一個快速緩存方法F可以用來更快的操作。

快速緩存Data數據,默認保存在DATA_PATH目錄下面

F('data',$Data);

快速緩存Data數據,保存到指定的目錄

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

獲取緩存數據

$Data?=?F('data');

刪除緩存數據

F('data',NULL);

F方法支持自動創建緩存子目錄,在DATA_PATH目錄下面緩存data數據,如果User子目錄不存在,則自動創建:

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

3.1.2版本開始F方法支持使用通配符批量刪除功能,使用如下:

F('User/*',NULL);

表示刪除DATA_PATH.’User/’目錄下面的數據緩存。

系統內置的數據字段信息緩存就是用了快速緩存機制。

查詢緩存

對于及時性要求不高的數據查詢,我們可以使用查詢緩存功能來提高性能,而且無需自己使用緩存方法進行緩存和獲取。

APP/config.php配置:

'DATA_CACHE_TIME'???=&gt;?60,?//?數據緩存有效期?0表示永久緩存 'DATA_CACHE_TYPE'???=&gt;?'File', ?//?數據緩存類型,支持:File|Db|Apc|Memcache|Shmop|Sqlite|Xcache|Apachenote|Eaccelerator 'DB_SQL_BUILD_CACHE'?=&gt;?true, 'DB_SQL_BUILD_LENGTH'?=&gt;?20,?//?SQL緩存的隊列長度 'DATA_CACHE_PATH'?=&gt;?TEMP_PATH,

查詢緩存功能支持所有的數據庫,并且支持所有的緩存方式和有效期。

在使用查詢緩存的時候,只需要調用Model類的cache方法,例如:

$Model-&gt;cache(true)-&gt;select();

如果使用了cache(true) ,則在查詢的同時會根據當前的查詢SQL生成查詢緩存,默認情況下緩存方式采用DATA_CACHE_TYPE參數設置的緩存方式(系統默認值為File表示采用文件方式緩存),緩存有效期是DATA_CACHE_TIME 參數設置的時間,也可以單獨制定查詢緩存的緩存方式和有效期:

$Model-&gt;cache(true,60,'xcache')-&gt;select();

表示當前查詢緩存的緩存方式為xcache,并且緩存有效期為60秒。

同樣的查詢,如果沒有使用cache方法,則不會獲取或者生成任何緩存,即便是之前調用過Cache方法。

查詢緩存只是供內部調用,如果希望查詢緩存開放給其他程序調用,可以指定查詢緩存的Key,例如:

$Model-&gt;cache('cache_name',60)-&gt;select();

則可以在外部通過S方法直接獲取查詢緩存的內容,

$value?=?S('cache_name');

除了select方法之外,查詢緩存還支持find和getField方法,以及他們的衍生方法(包括統計查詢和動態查詢方法)。具體應用的時候可以根據需要選擇緩存方式和緩存有效期。

SQL解析緩存

除了查詢緩存之外,ThinkPHP還支持SQL解析緩存,因為ThinkPHP的ORM機制,所有的SQL都是動態生成的,然后由數據庫驅動執行。

所以如果你的應用有大量的SQL查詢需求,那么可以開啟SQL解析緩存以減少SQL解析提高性能。要開啟SQL解析緩存,只需要設置:

'DB_SQL_BUILD_CACHE'?=&gt;?true,

即可開啟數據庫查詢的SQL創建緩存,默認緩存方式為文件方式,還可以支持xcache和apc方式緩存,只需要設置:

'DB_SQL_BUILD_QUEUE'?=&gt;?'xcache',

我們知道,一個項目的查詢SQL的量可能會非常巨大,所以有必要設置下緩存的隊列長度,例如,我們希望SQL解析緩存不超過20條記錄,可以設置:

'DB_SQL_BUILD_LENGTH'?=&gt;?20,?//?SQL緩存的隊列長度

注意:只有查詢方法才支持SQL解析緩存

靜態緩存

要使用靜態緩存功能,需要開啟HTML_CACHE_ON參數,并且使用HTML_CACHE_RULES配置參數設置靜態緩存規則文件 。

雖然也可以在應用配置文件中定義靜態緩存規則,但是建議是在模塊配置文件中為不同的模塊定義靜態緩存規則。

靜態規則定義

靜態規則的定義方式如下:

'HTML_CACHE_ON'?=&gt;?true,?//?開啟靜態緩存 'HTML_CACHE_TIME'?=&gt;?60,?//?全局靜態緩存有效期(秒) 'HTML_FILE_SUFFIX'?=&gt;?'.shtml',?//?設置靜態緩存文件后綴 'HTML_CACHE_RULES'?=&gt;?array(?//?定義靜態緩存規則 ?//?定義格式1?數組方式 ?'靜態地址'?=&gt;?array('靜態規則',?'有效期',?'附加規則'),? ?//?定義格式2?字符串方式 ?'靜態地址'?=&gt;?'靜態規則',? )

定義格式1采用數組方式 便于單獨為某個靜態規則設置不同的有效期,定義格式2采用字符串方式訂閱靜態規則,同時采用HTML_CACHE_TIME設置的全局靜態緩存有效期。

靜態緩存文件的根目錄在HTML_PATH定義的路徑下面,并且只有定義了靜態規則的操作才會進行靜態緩存。 并且靜態緩存支持不同的存儲類型。 靜態緩存僅在GET請求下面有效。

靜態地址

靜態地址包括下面幾種定義格式:

第一種是定義全局的操作靜態規則,例如定義所有的read操作的靜態規則為:

'read'=&gt;array('{id}',60)

其中,{id}

表示取$_GET[‘id’]

為靜態緩存文件名,第二個參數表示緩存60秒。

第二種是定義全局的控制器靜態規則,例如定義所有的User控制器的靜態規則為:

'user:'=&gt;array('User/{:action}_{id}','600')

其中,{:action}

表示當前的操作名稱

第三種是定義某個控制器的操作的靜態規則,例如,我們需要定義Blog控制器的read操作進行靜態緩存

'blog:read'=&gt;array('{id}',0)

第四種方式是定義全局的靜態緩存規則,這個屬于特殊情況下的使用,任何模塊的操作都適用,例如:

'*'=&gt;array('{$_SERVER.REQUEST_URI|md5}'),

表示根據當前的URL進行緩存。

靜態規則

靜態規則是用于定義要生成的靜態文件的名稱,靜態規則的定義要確保不會沖突,寫法可以包括以下情況:

1.使用系統變量

包括 _GET、_REQUEST、_SERVER、_SESSION、_COOKIE

格式:

{$_×××|function}

例如:

{$_GET.name}? {$_SERVER.REQUEST_URI|md5}

2.使用框架特定的變量

{:module}?、{:controller}?和{:action}

分別表示當前模塊名、控制器名和操作名。

例如:

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

3.使用_GET變量

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

4.直接使用函數

{|function} 例如:{|time}

5.支持混合定義

例如我們可以定義一個靜態規則為:

'{id},{name|md5}'

在{}之外的字符作為字符串對待,如果包含有”/”,會自動創建目錄。

例如,定義下面的靜態規則:

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

則會在靜態目錄下面創建模塊名稱的子目錄,然后寫入操作名_id.shtml 文件。

靜態緩存有效期

單位為秒。如果不定義,則會獲取配置參數HTML_CACHE_TIME的設置值,如果定義為0則表示永久緩存。

附加規則

通常用于對靜態規則進行函數運算,例如:

'read'=&gt;array('Think{id},{name}','60',?'md5')

翻譯后的靜態規則是

md5('Think'.$_GET['id'].?',?'.$_GET['name']);

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享