在專案中,合理的使用快取對效能有較大的幫助。thinkphp提供了方便的快取方式,包括資料快取、靜態快取和查詢快取等,支援包括檔案方式、apc、db、memcache、shmop、sqlite、redis、eaccelerator和xcache在內的動態資料快取型別,以及可定製的靜態快取規則,並提供了快捷方法進行訪問操作。
(3.1.2版本cache方法已經併入s方法,所以cache方法不再建議使用,直接使用s方法即可,和下文描述的cache方法用法一致)
1 快取初始化
cache(array('type'=>'xcache','expire'=>60));
複製**
快取初始化可以支援的引數根據不同的快取方式有所區別,常用的引數是:
expire
快取有效期(時間為秒)
prefix
快取標識字首
type
快取型別
核心版本只有file快取方式的支援,其他的快取方式支援需要**單獨的快取驅動,並放入系統目錄的extend/driver/cache/下面,否則會出現不支援快取型別的錯誤提示。
有些快取方式會有一些自身特殊的引數,例如memcache快取,還需要配置其他的引數: cache(array('type'=>'memcache','host'=>'192.168.1.10','port'=>'11211','prefix'=>'think','expire'=>60));
複製**
對於全域性的快取方式,一般我們建議新增prefix(快取字首)引數用以區分不同的應用,以免混淆。
2 快取設定
cache('a',$value);
複製**
會按照快取初始化時候的引數進行快取資料,也可以在快取設定的時候改變引數,例如: cache('a',$value,300);//快取資料300秒
複製**
甚至改變之前的快取方式或者更多的引數: cache('a',$value,array('type'=>'file','expire'=>300));//採用檔案方式快取資料300秒
複製**
如果你在快取設定的時候採用上面的陣列方式傳入引數的話,會影響到後面的快取訪問。
3 快取讀取
$value=cache('a');
複製**
快取讀取的是前面快取設定的值,這個值會受快取初始化或者快取設定的時候傳入的引數影響。
如果快取標識不存在或者已經過期,則返回false,否則返回快取值。
4 快取刪除
cache('a',null);
複製**
刪除快取標識為name的快取資料。
如果要切換快取方式,可以再次進行快取初始化操作或者使用下面的方式: $cache=cache(array('type'=>'xcache','prefix'=>'think','expire'=>600)); $cache->name='value';//設定快取 $value=$cache->name;//獲取快取 unset($cache->name);//刪除快取
複製**
如果你設定了快取字首的話,對應的快取操作只是對應該快取字首標識的,不會影響其他的快取。
資料快取可以支援快取佇列,簡單的說就是可以限制快取的數量,只需要在初始化的時候指定length引數: cache(array('type'=>'xcache','length'=>100,'expire'=>60));
複製**
設定了length引數後,系統只會快取最近的100條快取資料。
如果你僅僅是希望用檔案的方式快取一些簡單的資料,並且沒有有效期的概念,那麼系統還提供了乙個快速快取方法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/'目錄下面的資料快取。
系統內建的資料字段資訊快取就是用了快速快取機制。
對於及時性要求不高的資料查詢,我們可以使用查詢快取功能來提高效能,而且無需自己使用快取方法進行快取和獲取。
查詢快取功能支援所有的資料庫,並且支援所有的快取方式和有效期。
在使用查詢快取的時候,只需要呼叫model類的cache方法,例如: $model->cache(true)->select();
複製**
如果使用了cache(true) ,則在查詢的同時會根據當前的查詢sql生成查詢快取,預設情況下快取方式採用data_cache_type引數設定的快取方式(系統預設值為file表示採用檔案方式快取),快取有效期是data_cache_time 引數設定的時間,也可以單獨制定查詢快取的快取方式和有效期: $model->cache(true,60,'xcache')->select();
複製**
表示當前查詢快取的快取方式為xcache,並且快取有效期為60秒。
同樣的查詢,如果沒有使用cache方法,則不會獲取或者生成任何快取,即便是之前呼叫過cache方法。
查詢快取只是供內部呼叫,如果希望查詢快取開放給其他程式呼叫,可以指定查詢快取的key,例如: $model->cache('cache_name',60)->select();
複製**
則可以在外部通過s方法直接獲取查詢快取的內容, $value=s('cache_name');
複製**
除了select方法之外,查詢快取還支援find和getfield方法,以及他們的衍生方法(包括統計查詢和動態查詢方法)。具體應用的時候可以根據需要選擇快取方式和快取有效期。
要使用靜態快取功能,需要開啟html_cache_on 引數,並且使用html_cache_rules配置引數設定靜態快取規則檔案 。
靜態規則的定義方式如下: 'html_cache_on'=>true,//開啟靜態快取 'html_file_suffix'=>'.shtml',//設定靜態快取字尾為.shtml 'html_cache_rules'=>array( 'actionname(小寫)'=>array('靜態規則','靜態快取有效期','附加規則'), 'modulename(小寫)'=>array('靜態規則','靜態快取有效期','附加規則'), 'modulename(小寫):actionname(小寫)'=>array('靜態規則','靜態快取有效期','附加規則'), '*'=>array('靜態規則','靜態快取有效期','附加規則'), //…更多操作的靜態規則 )
複製**
靜態快取檔案的根目錄在html_path 定義的路徑下面,並且只有定義了靜態規則的操作才會進行靜態快取。
第一種是定義全域性的操作靜態規則,例如定義所有的read操作的靜態規則為: 'read'=>array('','60')
複製**
其中, 表示取$_get['id'] 為靜態快取檔名,第二個引數表示快取60秒
第二種是定義全域性的模組靜態規則,例如定義所有的user模組的靜態規則為: 'user:'=>array('user/_','600')
複製**
其中, 表示當前的操作名稱
第三種是定義某個模組的操作的靜態規則,例如,我們需要定義blog模組的read操作進行靜態快取 'blog:read'=>array('',0)
複製**
有個別特殊的規則,例如空模組和空操作的靜態規則的定義,可以使用下面的方式: 'empty:index'=>array('_',0)//定義空模組的靜態規則 'user:_empty'=>array('user/',0)//定義空操作的靜態規則
複製**
第四種方式是定義全域性的靜態快取規則,這個屬於特殊情況下的使用,任何模組的操作都適用,例如 '*'=>array(''),
複製**
根據當前的url進行快取
靜態規則是用於定義要生成的靜態檔案的名稱,靜態規則的定義要確保不會衝突,寫法可以包括以下情況:
1、使用系統變數 包括 _get _request _server _session _cookie
格式:
例如:
複製**
2、使用框架特定的變數
例如:、 、 和 分別表示當前專案名、分組名、模組名和操作名。
3、使用_get變數
也就是說 其實等效於
4、直接使用函式
例如:
複製**
5、支援混合定義,例如我們可以定義乙個靜態規則為: ','
複製**
在{}之外的字元作為字串對待,如果包含有」/」,會自動建立目錄。
例如,定義下面的靜態規則: /_
複製**
則會在靜態目錄下面建立模組名稱的子目錄,然後寫入操作名_id.shtml 檔案。
靜態有效時間 單位為秒。如果不定義,則會獲取配置引數html_cache_time 的設定值,如果定義為0則表示永久快取。
附加規則通常用於對靜態規則進行函式運算,例如 'read'=>array('think,','60','md5')
複製**
翻譯後的靜態規則是 md5('think'.$_get['id']. ', '.$_get['name']);
和靜態快取相關的配置引數包括: html_cache_on是否開啟靜態快取功能 html_file_suffix靜態檔案字尾慣例配置的值是.html html_cache_time預設的靜態快取有效期預設60秒可以在靜態規則定義覆蓋
複製**
要善於利用thinkphp的快取功能,更重要的是區分什麼時候用何種快取方式更加有效。快取也不是萬能的,沒有快取是萬萬不能的^_^
ThinkPHP3 1快速入門(9)變數輸出
這一篇我們來詳細了解下如何在模板中使用標籤輸出模板變數。變數輸出的方法很簡單,例如,在控制器中我們給模板變數賦值 name thinkphp this assign name name this display 複製 然後就可以在模板中使用 hello,複製 模板編譯後的結果就是 hello,複製 ...
ThinkPHP3 1快速入門(15)模板布局
thinkphp的模板引擎內建了布局模板功能支援,可以方便的實現模板布局以及布局巢狀功能。有三種布局模板的支援方式 這種方式僅需在專案配置檔案中新增相關的布局模板配置,就可以簡單實現模板布局功能,比較適用於全站使用相同布局的情況,需要配置開啟layout on 引數 預設不開啟 並且設定布局入口檔名...
ThinkPHP3 1快速入門(21)IP位址定位
可以在官網的 ip定位擴充套件類庫,或者 擴充套件包 裡面也已經包含該擴充套件類了。如果是單獨 的上傳類庫,把解壓後的iplocation.class.php 放入thinkphp extend library org net 如果沒有請手動建立 目錄下面。如果你僅僅需要獲取使用者訪問的ip位址,那...